hdu4632 Palindrome subsequence ——区间动态规划

link:http://acm.hdu.edu.cn/showproblem.php?pid=4632

refer to:

o(╯□╰)o……明明百度找的题解,然后后来就找不到我看的那份了,这位哥们对不住了……

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <cctype>
 7 #include <algorithm>
 8 #include <queue>
 9 #include <deque>
10 #include <queue>
11 #include <list>
12 #include <map>
13 #include <set>
14 #include <vector>
15 #include <utility>
16 #include <functional>
17 #include <fstream>
18 #include <iomanip>
19 #include <sstream>
20 #include <numeric>
21 #include <cassert>
22 #include <ctime>
23 #include <iterator>
24 const int INF = 0x3f3f3f3f;
25 const int dir[8][2] = {{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
26 using namespace std;
27 char a[1111];
28 int dp[1111][1111];
29 const int MOD = 10007;
30 int main(void)
31 {
32     #ifndef ONLINE_JUDGE
33     freopen("in.txt", "r", stdin);
34     #endif // ONLINE_JUDGE
35     ios::sync_with_stdio(false);
36     int t; cin>>t;
37     for (int k = 1; k <= t; ++k)
38     {
39         cin>>a; int len = strlen(a);
40         memset(dp, 0, sizeof(dp));
41         for (int i = 0; i < len; ++i) for (int j = 0; j < len; ++j)
42             if (i==j) dp[i][j] = 1;
43         for (int i = 0; i < len; ++i)
44         {
45             for (int j = 0; i+j < len; ++j)
46             {
47                 if (a[i+j] == a[j])
48                 {
49                     dp[j][i+j] = dp[j][i+j-1] + dp[j+1][i+j] + 1;
50                 }
51                 else
52                 {
53                     dp[j][i+j] = dp[j+1][i+j] + dp[j][i+j-1] - dp[j+1][i+j-1];
54                 }
55                 dp[j][i+j] = (dp[j][i+j] + MOD)%MOD;
56             }
57         }
58         cout<< "Case "<<k<< ": "<<dp[0][len-1]<<endl;
59     }
60     return 0;
61 }
62 /*
63     模拟一下第二个样例 aaaaa 就懂了
64 */

o(╯□╰)o
永远感觉规划是一个很神奇的东西,比如这道。想明白了就感觉很神奇~

原文地址:https://www.cnblogs.com/liuxueyang/p/3234797.html