UVA 10617 Again Palindrome
2011-11-29 20:04
183 查看
UVA_10617
这个题目可以用区间动规去处理。
我们设f[i][j]为字符串i到j这个区间内回文串的个数,那么如果b[i]==b[j],f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+f[i+1][j-1]+1=f[i+1][j]+f[i][j-1]+1,也就是说f[i][j]包括4个部分,第一部分是b[i]和中间的字符形成的回文串,第二部分是b[j]和中间的字符形成的回文串,这两部分也就等于区间[i,j-1]内的回文串的个数加上[i+1,j]内回文串的个数再减去区间[i+1,j-1]内的回文串的个数,也就是f[i+1][j]+f[i][j-1]-f[i+1][j-1],第三部分是b[i]、b[j]和中间的字符形成的回文串,也就是f[i+1][j-1],第四部分是仅由b[i]和b[j]这对组成的这一个回文串,所以是1,四部分综合到一起就是f[i][j]=f[i+1][j]+f[i][j-1]+1。
同理,如果b[i]!=b[j],那么f[i][j]= f[i+1][j]+f[i][j-1]-f[i+1][j-1]。
这个题目可以用区间动规去处理。
我们设f[i][j]为字符串i到j这个区间内回文串的个数,那么如果b[i]==b[j],f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+f[i+1][j-1]+1=f[i+1][j]+f[i][j-1]+1,也就是说f[i][j]包括4个部分,第一部分是b[i]和中间的字符形成的回文串,第二部分是b[j]和中间的字符形成的回文串,这两部分也就等于区间[i,j-1]内的回文串的个数加上[i+1,j]内回文串的个数再减去区间[i+1,j-1]内的回文串的个数,也就是f[i+1][j]+f[i][j-1]-f[i+1][j-1],第三部分是b[i]、b[j]和中间的字符形成的回文串,也就是f[i+1][j-1],第四部分是仅由b[i]和b[j]这对组成的这一个回文串,所以是1,四部分综合到一起就是f[i][j]=f[i+1][j]+f[i][j-1]+1。
同理,如果b[i]!=b[j],那么f[i][j]= f[i+1][j]+f[i][j-1]-f[i+1][j-1]。
#include<stdio.h> #include<string.h> #define MAXD 70 int N; long long int f[MAXD][MAXD]; char b[MAXD]; void solve() { int i, j, k; long long int temp; scanf("%s", b); N = strlen(b); memset(f, 0, sizeof(f)); for(i = 0; i < N; i ++) f[i][i] = 1; for(k = 1; k < N; k ++) for(i = 0; i + k < N; i ++) { if(b[i] == b[i + k]) f[i][i + k] = f[i][i + k - 1] + f[i + 1][i + k] + 1; else f[i][i + k] = f[i + 1][i + k] + f[i][i + k - 1] - f[i + 1][i + k - 1]; } printf("%lld\n", f[0][N - 1]); } int main() { int t; scanf("%d", &t); while(t --) { solve(); } return 0; }
相关文章推荐
- Again Palindromes - UVa 10617 dp
- Uva 10617 Again Palindromes
- UVa 10617 Again Palindrome(经典回文串区间DP)
- uva 10617
- UVa 10617 - Again Palindrome
- UVA - 10617 Again Palindrome 字符串的回文子串
- uva10617 - Again Palindrome(dp)
- uva 10617(dp)
- UVA 10617 - Again Palindrome
- UVA 10617 区间DP
- UVA 10617 Again Palindrome
- uva 10617 回文串个数
- UVA 10617
- Uva 10617 Again Palindrome(区间dp)
- UVa 10617 Again Palindrome(回文 区间dp)
- UVA 10617 Again Palindrome
- UVA - 10617 Again Palindrome
- uva 10617 Again Palindrome (DP)
- UVa 10617 Again Palindromes / 记忆化搜索
- uva 10617 - Again Palindrome(dp)