uva_10617_Again Palindrome(普通DP, 记忆化搜索)
2012-11-23 10:13
489 查看
这里的阶段就是按照字符串的顺序的方向进行规划 每个阶段的状态dp[i][j] 表示字符串中从第i个字符到第j个字符回文串的个数 dp[i+1][j-1]+cost str[i] = str[j] 状态转移: dp[i][j] = dp[i+1][j-1] dp[i][j] 是枚举i到j的所有可能,还有的是要注意重复加 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 61 char str[MAXN]; int added[MAXN][MAXN]; long long dp[MAXN][MAXN]; long long dfs(const int &l, const int &r) { if( l >= r ) { return dp[l][r] = 0; } if( -1 != dp[l][r] ) { return dp[l][r]; } long long rst(0); for(int i = l; i <= r; i ++) { for(int j = i+1; j <= r; j ++) { dp[i+1][j-1] = (-1 == dp[i+1][j-1])? dfs(i+1, j-1) : dp[i+1][j-1]; if( str[i] == str[j] ) { rst += dp[i+1][j-1]+(j-i-1)+1; } else if( !added[i+1][j-1] ) { rst += dp[i+1][j-1]; } } } added[l][r] = 1; return dp[l][r] = rst; } int main(int argc, char const *argv[]) { #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); #endif int cas; scanf("%d", &cas); for( ; cas; cas --) { scanf("%s", str); memset(dp, -1, sizeof(dp)); memset(added, 0, sizeof(added)); printf("%lld\n", dfs(0, strlen(str)-1)+strlen(str)); } return 0; }
相关文章推荐
- UVA 10617 Again Palindrome 又是回文 dp,记忆化搜索
- UVa 10617 Again Palindrome(回文 区间dp)
- uva 10617 Again Palindrome (DP)
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- 例题9-10 UVA 1626 Brackets sequence (dp递推 || 记忆化搜索)
- UVA 1252 Twenty Questions 状态压缩dp 记忆化搜索
- uva 10617 Again Palindromes(DP)
- UVA 1630 Folding——区间DP(记忆化搜索)
- uva_10827_Maximum sum on a torus( 普通DP )
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- uva 10285 The Tower of Babylon(dp,记忆化搜索)
- UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)
- 记忆化搜索 逆向dp uva10118
- 记忆化搜索 区间dp uva629
- uva 10617(dp)
- UVA - 10617 Again Palindrome——dp
- uva 10599 - Robots(II) (dp | 记忆化搜索)
- 【区间dp】【记忆化搜索】UVALive - 3516 - Exploring Pyramids
- uva_10069_Distinct Subsequences (普通DP)
- UVA 10617 Again Palindromes (区间dp)