LightOJ 1025 - The Specials Menu(区间DP)

原创 2015年11月19日 20:11:00

题意:给一个字符串,问删掉任意个字符串后为回文串的有多少个。

思路:很明显的区间DP。dp[i][j]记录从i到j的字符串删掉字符后可以得到回文串的种数。这里对于每一个i和j,无需扫描i和j中间的k值来更新,因为dp[i][j]只和i+1和j-1的字符有关。有两种情况:

1)s[i] != s[j]时,我们考虑dp[i][j]从dp[i+1][j]和dp[i][j-1]转移,删掉s[j],dp[i][j] += dp[i][j-1],删掉s[i],dp[i][j] += dp[i+1][j],但存在同时删除的情况,所以其中dp[i+1][j-1]为重复计算的部分,所以有dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]。

2)s[i] == s[j]时,那么显然,对于从i+1到j-1的字符,我们删去后得到的回文串s',左右加上s[i]和s[j]仍为回文串。删掉i+1到j-1的所有字符后,剩下"s[i]s[j]"也为回文串,所以有dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1] + dp[i+1][j-1] + 1 = dp[i+1][j] + dp[i][j-1] + 1。

#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>
using namespace std;

typedef long long LL;
#define mem(a, n) memset(a, n, sizeof(a))
#define ALL(v) v.begin(), v.end()
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define pb push_back
#define eps 1e-8
const int inf = 0x3f3f3f3f, N = 60 + 5, MOD = 1e9 + 7;

int T, cas = 0;
int n, m;
char s[N];
LL dp[N][N];

int main(){
#ifdef LOCAL
    freopen("/Users/apple/input.txt", "r", stdin);
//  freopen("/Users/apple/out.txt", "w", stdout);
#endif
	
    si(T);
    while(T --) {
    	scanf("%s", s);
    	n = strlen(s);
    	mem(dp, 0);
    	for(int i = 0; i < n; i ++) dp[i][i] = 1;
    	for(int j = 1; j < n; j ++) {
    		for(int i = j - 1; i >= 0; i --) {
    			if(s[i] == s[j]) dp[i][j] = dp[i+1][j] + dp[i][j-1] + 1;
    			else dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1];
    		}
    	}
    	printf("Case %d: %lld\n", ++ cas, dp[0][n-1]);
    }
    
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

lightoj 1025 The Specials Menu (DP)

Feuzem is an unemployed computer scientist who spends his days working at odd-jobs. While on the job...

LightOJ 1025 - The Specials Menu

题意:其实题意就是问你任意删除字符,能够得到多少个回文字符串。 区间dp是没跑的。dp[i][j]代表从i到j里有多少回文串。 如果s[i]!=s[j],那么只要只需要统计i到j-1和i+1到j之间各...
  • CQUWEL
  • CQUWEL
  • 2015年11月20日 21:24
  • 311

lightoj 1025【区间DP】

题意: 给出一个word,求有多少种方法你从这个word清除一些字符而达到一个回文串。思路: 区间问题,还是区间DP; 我判断小的区间有多少,然后往外扩大一点。 dp[i,j]就代表从i到j的...

LightOJ1422---Halloween Costumes (区间dp)

Gappu has a very busy weekend ahead of him. Because, next weekend is Halloween, and he is planning t...

LightOJ - 1422Halloween Costumes (区间DP)

Halloween CostumesGappu has a very busy weekend ahead of him. Because, next weekend is Halloween, an...

LightOj 1422 Halloween Costumes(区间DP)

LightOj 1422 Halloween Costumes(区间DP)
  • Dacc123
  • Dacc123
  • 2016年03月26日 10:47
  • 221

lightoj 1033 - Generating Palindromes LCSor区间DP

给定一个字符串,问最少添加多少个字符是一个回文串。 以前用区间DP做过,用LCS也做过... LCS就是把字符串逆置过来...求两串的最长公共子序列,那么len-LCS就是需要添加的字符。 LC...

LightOJ 1422 Halloween Costumes (区间dp)

1422 - Halloween Costumes PDF (English) Statistics Forum Time...

#LightOJ 1422 Halloween奇怪的区间dp

Halloween题意&分析: 万圣节当天参加一些Party,每一场Party都要穿相应的衣服。一可以套着穿多件,如果某两场Party衣服一样,只要不曾脱下,同一件就可以接着用,否则就要另外再穿一件...

lightoj 1031 - Easy Game 【区间dp】360 2017笔试编程题3

题意:两个小孩轮流从一段数字的左边或者右边取走连续的一段,问先手比后手最多多得多少分 尼玛,区间dp居然还有这么玩的==我们可以想到这种题都是小区间合并成大区间的,然而这种类似于博弈的做法实在是让人...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LightOJ 1025 - The Specials Menu(区间DP)
举报原因:
原因补充:

(最多只允许输入30个字)