uva 10617

来源:互联网 发布:windows linux mac知乎 编辑:程序博客网 时间:2024/06/11 16:13

这题想了一下,可以枚举出str[i]、str[j]的所有决策:

1、如果str[i] == str[j],不删除str[i] str[j]:dp[i][j] += dp[i+1][j-1] + 1(1表示把[i+1,j-1]全删除后,它还是回文);

2、删除str[i]:就是dp[i+1][j];

3、删除str[j]:就是dp[i][j-1];

4、同时删除str[i]、str[j]:就是dp[i+1][j-1];注意2和3的重合就是4情况。

过了样例,提交居然WA了!一看网上的代码,居然是64位!于是改成long long。AC!

//uva_10617.c#include <stdio.h>#include <string.h>#defineN70charstr[N];long longdp[N][N];int main(){int i, j, n, t;scanf("%d", &t );while ( t -- ) {scanf("%s", str );memset( dp, 0, sizeof(dp) );n = strlen(str);for ( i = 0; i < n; ++ i )dp[i][i] = 1;for ( i = n-2; i >= 0; -- i ) {for ( j = i+1; j < n; ++ j ) {if ( str[i] == str[j] ) {//no removedp[i][j] = dp[i+1][j-1] + 1;//1表示i+1-->j-1全部删除}dp[i][j] += dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];}}printf("%lld\n", dp[0][n-1] );}return 0;}


原创粉丝点击