首页 > 代码库 > Light oj 1044 - Palindrome Partitioning(区间dp)

Light oj 1044 - Palindrome Partitioning(区间dp)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1044

dp[i][j]表示i到j直接的最小回文区间个数,直接看代码

 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e3 + 5; 4 int dp[N][N], inf = 1e9; 5 char str[N]; 6 bool judge(int l, int r) { 7     for(int i = l - 1, j = r - 1; i < j; ++i, --j) { 8         if(str[i] != str[j]) 9             return false;10     }11     return true;12 }13 int dfs(int l, int r) {14     if(l == r)15         return dp[l][l] = 1;16     if(l > r)17         return 0;18     if(dp[l][r] < inf)19         return dp[l][r];20     int ans = inf;21     for(int i = r; i >= l; --i) {22         if(judge(i, r))23             ans = min(ans, dfs(l, i - 1) + 1);24     }25     return dp[l][r] = ans;26 }27 28 int main()29 {30     int t;31     scanf("%d", &t);32     for(int ca = 1; ca <= t; ++ca) {33         scanf("%s", str);34         int len = strlen(str);35         for(int i = 1; i <= len; ++i) {36             for(int j = 1; j <= len; ++j) {37                 dp[i][j] = inf;38             }39         }40         printf("Case %d: %d\n",ca, dfs(1, len));41     }42     return 0;43 }

 

Light oj 1044 - Palindrome Partitioning(区间dp)