您的位置:首页 > 其它

uva 10617

2012-11-28 22:25 316 查看
这题想了一下,可以枚举出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>

#define	N	70
char	str
;
long long		dp

;

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 remove
					dp[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: