UVa11584(動態規劃) 記憶化搜尋
阿新 • • 發佈:2018-12-13
思路:這道題目是一個判斷迴文串的題。
動態轉移方程:dp[i]=min(dp[i],dp[j[+1);
其中 dp[i]表示的就是1~i的劃分迴文串最小的分段。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1010; const int inf =0x3f3f3f; typedef long long ll; int n; char ch[maxn]; int vis[maxn][maxn]; int dp[maxn], p[maxn][maxn]; int isPalindromes(int i,int j) { if(i>=j) return 1; if(ch[i]!=ch[j]) return 0; if(vis[i][j]==1) return p[i][j]; vis[i][j]=1; p[i][j]=isPalindromes(i+1,j-1); return p[i][j]; } int main() { // freopen("out","w",stdout); scanf("%d",&n); while(n--) { memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); memset(p,0,sizeof(p)); scanf("%s",ch+1); int len=strlen(ch+1); for(int i=1;i<=len;i++) { dp[i]=i; for(int j=0;j<=i;j++) { if(isPalindromes(j+1,i)) dp[i]=min(dp[i],dp[j]+1); } } printf("%d\n",dp[len]); } return 0; }