HDU 4632 Palindrome subsequence(區間DP 迴文子串的個數)
阿新 • • 發佈:2019-01-31
題意略。
思路:設dp[i][j] 為i到j內迴文子串的個數。
那麼狀態轉移方程為dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1]
如果a[i] = a[j] ,dp[i][j] += (dp[i+1][j-1] + 1)。
我的程式碼:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int maxn = 1005; const int mod = 10007; char a[maxn]; int n,dp[maxn][maxn]; int solve(){ memset(dp,0,sizeof(dp)); for(int i = n-1 ; i >= 0 ;i--){ for(int j = i ;j < n ; j++){ dp[i][j] = (dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1] + mod) % mod; if(a[i] == a[j]) dp[i][j] = (dp[i][j] + dp[i+1][j-1] + 1) % mod; } } return dp[0][n-1]; } int main(){ int cas; scanf("%d",&cas); for(int T = 1 ; T <= cas; T++){ scanf("%s",a); n = strlen(a); printf("Case %d: %d\n",T,solve()); } return 0; }