40%的数据满足:1<=n<=10
100%的数据满足:1<=n<=50
题解:
设定dp[l][r];表示l到r的答案,
我们考虑
s[l]==s[r]时,转移就是dp[l][r]=min(dp[l+1][r],dp[l][r-1]);
s[r]==s[r-1],转移就是dp[l][r] = dp[l][r-1];
s[l]==s[l+1],转移就是dp[l][r] = dp[l+1][r];
其他就是取两个区间和之最小
递归好写
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; const int N = 100, M = 30005, mod = 1e9+9, inf = 0x3f3f3f3f; typedef long long ll; int dp[N][N]; char s[M]; int dfs(int l,int r) { if(l==r) return 1; int& ans = dp[l][r]; if(ans) return ans; ans = r-l+1; if(s[l]==s[l+1]) return ans = dfs(l+1,r); if(s[r]==s[r-1]) return ans = dfs(l,r-1); if(s[l]==s[r]) return ans = min(dfs(l+1,r),dfs(l,r-1)); for(int i=l;i<r;i++) ans = min(ans,dfs(l,i)+dfs(i+1,r)); return ans; } int main() { scanf("%s",s); int n = strlen(s)-1; printf("%d\n",dfs(0,n)); return 0; }
BZOJ 1260: [CQOI2007]涂色paint 区间DP
原文:http://www.cnblogs.com/zxhl/p/5263823.html