题目链接:
Lightoj 1044 - Palindrome Partitioning
题目描述:
给一个字符串,问至少分割多少次?分割出来的子串都是回文串。
解题思路:
先把给定串的所有子串是不是回文串处理出来,然后用dp[i] 表示 从起点到串i的位置的最少分割次数,然后结合处理出来的回文串转移一下即可!
还是好蠢哦!自己竟然感觉是一个区间DP,但是n又那么大,完全不是区间DP的作风啊!
1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 using namespace std; 8 typedef long long LL; 9 const int maxn = 1010; 10 const int INF = 0x3f3f3f3f; 11 12 int dp[maxn]; 13 bool a[maxn][maxn]; 14 char str[maxn]; 15 int main () 16 { 17 int T; 18 scanf ("%d", &T); 19 for (int t=1; t<=T; t++) 20 { 21 scanf ("%s", str+1); 22 memset(a, false, sizeof(a)); 23 int len = strlen (str+1); 24 25 for (int i=1; str[i]; i++) 26 a[i][i] = true; 27 28 for (int i=2; i<=len; i++) 29 for (int l=1; l+i<=len+1; l++) 30 { 31 int r = l + i - 1; 32 if ((r == l + 1 || a[l+1][r-1]) && str[l] == str[r]) a[l][r] = true; 33 else a[l][r] = false; 34 } 35 36 dp[0] = 0; 37 for (int i=1; i<=len; i++) 38 { 39 dp[i] = INF; 40 for (int j=1; j<=i; j++) 41 if (a[j][i]) dp[i] = min (dp[i], dp[j-1]+1); 42 } 43 printf ("Case %d: %d\n", t, dp[len]); 44 } 45 return 0; 46 }
时间: 2024-10-05 23:11:08