首页 > 代码库 > lightoj1025_区间dp
lightoj1025_区间dp
题目链接: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 0x3f3f3f3f14 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 else36 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。