题意:
给你一个只含小写字母的字符串,每次只能删除一段含有一样字母区间,问最少删多少次,能删除整个字符串
分析:
状态:dp[i][j]代表区间i,j完全删除需要多少步
转移:当存在i<=k<j,使得str[k]=str[j],那么我们可以将str[k+1~j]删除至
只剩下str[j]一种字母的字串,然后和str[k]合并,省去一步的时间。
例如babaca
当i=1,j=6,k=4时
将str[5~6] ca删至a,然后与baba合并,显然dp[5][6]中删除a的那一步就可以省去,所以k=4时,转移方程为:
dp[1][6]=min(dp[1][6],d
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define maxn 510 int dp[maxn][maxn]; char str[maxn]; int main() { //ios::sync_with_stdio(false); int n;scanf("%d",&n); scanf("%s", str+1); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { dp[i][i]=1; } for(int L=2;L<=n;L++) { for(int i=1;i+L-1<=n;i++) { int j=i+L-1; dp[i][j]=n; for(int k=i;k<j;k++) { if(str[k]==str[j]) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]-1); } else { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); } } } } printf("%d ",dp[1][n]); return 0; }
p[1][4]+dp[5][6]-1);