码迷,mamicode.com
首页 > 其他好文 > 详细

lightoj1025_区间dp

时间:2016-10-04 21:13:01      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

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

题目描述:

  给出一个字符串,可以任意删除位置的字符,也可以删除任意多个。问能组成多少个回文串?

解题思路:

  自从开始学dp,感觉自己智商一直处于离线状态。席八啊啊啊啊啊啊!今天随机到这个题目,看了好久竟然没有看出来是区间DP。知道是区间DP后立马感觉明白。

  情景设定 dp[l][r] 表示 区间 [l, r] 内的回文串数目。

  状态转移:dp[l][r] = dp[l][r-1] + dp[l+1][r], 但是这样会加重复的,所以要减去dp[l+1][r-1], 当a[l] == a[r]的时候,对于区间[l, r]之间的回文串,就可以变成以a[l]与a[r]结尾的,然后就需要加上。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cstdio>
 6 #include <vector>
 7 #include <ctime>
 8 #include <queue>
 9 #include <list>
10 #include <set>
11 #include <map>
12 using namespace std;
13 #define INF 0x3f3f3f3f
14 typedef long long LL;
15 
16 char a[100];
17 LL dp[100][100];
18 int main()
19 {
20     int t;
21     scanf("%d", &t);
22     for(int ca = 1; ca <= t; ca++)
23     {
24         scanf("%s", a+1);
25         int len = strlen(a+1);
26         memset(dp, 0, sizeof(dp));
27         for(int i = 1; i <= len; i++)
28         {
29             for(int l = 1; l+i-1 <= len; l++)
30             {
31                 int r = l+i-1;
32                 dp[l][r] += dp[l+1][r] + dp[l][r-1];
33                 if(a[l] == a[r])
34                     dp[l][r]++;
35                 else
36                     dp[l][r] -= dp[l+1][r-1];
37             }
38         }
39         printf("Case %d: %lld\n", ca, dp[1][len]);
40     }
41     return 0;
42 }

 

lightoj1025_区间dp

标签:

原文地址:http://www.cnblogs.com/luomi/p/5931205.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!