<h2>解析</h2>
这个题目如果只看前半部分不难想到这个题目就是一个多维的dp,后面的描述具有一定的迷惑性,但是并不能影响这个题目用dp的做法,看了一些大佬的代码都对后面的那些进行了分析,个人感觉不做分析也可以做。
首先我们来看这个题目,我们可以看成两个人在两个管子里取球,然后取球相同的情况,稍后解释为什么能看成这个模型,我们可以设置一个dp数组dp[i][j][k][l],表示第一个人在第一个管子里取i个,在第二个管子里取j个,第二个人在第一个管子里取k个,第二个管子里取l个。但是这个四维数组无论是时间还是空间,在这个题目中明显都不能接受,但是我们可以知道所以我们第四维就可以去掉。
然后我们解释一下为什么可以看成这个模型:在这个题目中我们有两种颜色的球,然后我们要从两个管子中取球然后放入第三个管子中,这里两个管子中的球就相当于两个人的取球轨迹,比如题目中的AB,A,就相当于第一个在第一个管子里和第二个管子里各取了一个球,然后第二个人在第一个管子里取了一个球,当然取球的顺序可以不一样,可以是先第一个人在第一个管子里取了一个球,然后第二个人在第一个管子里取一个球,然后再第一个在第一个管子里取了一个球。
1.考虑状态int & a m p ; x = d p [ i ] [ j ] [ k ] , l = = i + j - k。
2.如果,表示第一个人管道1多选了一个,第二个 人管道1多选了一个,所以有:
3.如果,表示第一个人管道1多选了一个,第二个 人管道2多选了一个,所以有
4.如果,表示第一个人管道2多选了一个,第二个 人管道1多选了一个,所以有:
5.如果,表示第一个人管道2多选了一个,第二个 人管道2多选了一个,所以有:
6.最后的结果就是;
最后我们还可以用滚动数组优化一下,直接看代码就好了
<h2>代码</h2>
#include&lt;bits/stdc++.h&gt; #define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; const int mod=1024523; int n,m; int dp[2][507][507]; string a,b; int main(void) { cin&gt;&gt;n&gt;&gt;m&gt;&gt;a&gt;&gt;b; a=&quot;#&quot;+a,b=&quot;#&quot;+b; dp[0][0][0]=1; for(int i=0,now=0;i&lt;=n;++i,now^=1) for(int j=0;j&lt;=m;++j) for(int k=0;k&lt;=n;++k) { int l=i+j-k; if(l&lt;0||l&gt;m)continue; int &amp;x=dp[now][j][k]; if(a[i+1]==a[k+1]) dp[now^1][j][k+1]=(dp[now^1][j][k+1]+x)%mod; if(a[i+1]==b[l+1]) dp[now^1][j][k]=(dp[now^1][j][k]+x)%mod; if(b[j+1]==a[k+1]) dp[now][j+1][k+1]=(dp[now][j+1][k+1]+x)%mod; if(b[j+1]==b[l+1]) dp[now][j+1][k]=(dp[now][j+1][k]+x)%mod; x=0; } cout&lt;&lt;dp[!(n&amp;1)][m][n]; return 0; }