您的位置:首页 > 其它

【区间dp】LightOJ 1025 The Specials Menu

2016-10-19 21:49 363 查看
我是弱鸡,递推式推理错误,能wa n发。

队友提点,由小区间推大区间。举一个列子理解:abca,首位和末尾是相同的,那么其区间方法数为abc区间方法数+bca区间放法数在加1(代表abca不处理);如果:abcd,首位和末尾不相同的,那么其方法数为abc方法数+bcd方法数-bc方法数(因为重复计算)。

注意:答案的范围

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const double PI = 2*acos(0.0);
const double add = 1e-9;
const int N = 100;

char s
;
long long dp

;
int main()
{
int T,cas = 1;
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
int n = strlen(s);
memset(dp,0,sizeof(dp));
for(int i = n-1; i >= 0; i--)
{
for(int j = i; j < n; j++)
{
if(i == j) dp[i][j] = 1;
else
{
if(s[i] != s[j])
dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];
else
dp[i][j] = dp[i+1][j] + dp[i][j-1] +1;
}
}
}
printf("Case %d: %lld\n",cas++,dp[0][n-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: