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!
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; }
相关文章推荐
- uva10617 - Again Palindrome(记忆化搜索)
- UVa 10617 Again Palindrome(回文串区间DP)
- uva 10617 Again Palindromes(DP)
- uva 10617
- uva 10617
- Again Palindromes - UVa 10617 dp
- Uva 10617 Again Palindromes
- UVa 10617 - Again Palindrome
- UVA - 10617 Again Palindrome 字符串的回文子串
- uva10617 - Again Palindrome(dp)
- uva 10617(dp)
- UVa 10617 Again Palindrome(经典回文串区间DP)
- UVA 10617 区间DP
- UVA 10617 - Again Palindrome
- uva 10617 回文串个数
- UVA 10617
- UVA 10617 Again Palindrome
- UVA - 10617 Again Palindrome
- uva 10617 Again Palindrome (DP)
- Uva 10617 Again Palindrome(区间dp)