BZOJ_1566
这道题主要是转换模型,我们可以认为这是两个人X,Y在玩取珠子游戏,设X最终取出珠子的方案是PiX,Y的方案是PiY,那么原来求得∑ai^2就是∑ PiX ==PiY,因为对于i类方案,X一共有ai种方案,Y一共有bi种方案,加在一起就有ai^2种方案了。
DP的话i,j,k分别表示X选了A管道的i个,X选了B管道的j个,Y选了A管道的k个(另外的Y选B管道 = i+j-k) 那么一种就有四种方式转移了。
#include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <algorithm> #include <cmath> using namespace std; const int N = 503; const int mod = 1024523; char a[N],b[N]; int n,m,dp[N][N][N]; int main() { scanf("%d%d",&n,&m); scanf("%s",a+1); scanf("%s",b+1); reverse(a+1,a+n+1); reverse(b+1,b+m+1); dp[0][0][0] = 1; for(int i = 0 ; i <= n ; ++i) { for(int j = 0 ; j <= m ; ++j) { for(int k = 0 ; k <= n ; ++k) { int t = i + j - k; if(t < 0 || t > m) continue; if(i!=0 && k!=0 && a[i]==a[k]) dp[i][j][k] = (dp[i][j][k]+dp[i-1][j][k-1])%mod; if(i!=0 && t!=0 && a[i]==b[t]) dp[i][j][k] = (dp[i][j][k]+dp[i-1][j][k])%mod; if(j!=0 && k!=0 && b[j]==a[k]) dp[i][j][k] = (dp[i][j][k]+dp[i][j-1][k-1])%mod; if(j!=0 && t!=0 && b[j]==b[t]) dp[i][j][k] = (dp[i][j][k]+dp[i][j-1][k])%mod; } } } cout << dp[n][m][n]; }