解题:NOI 2009 管道取珠

题面

考虑这个平方的实际意义,实际是说取两次取出一样的序列

那么设$dp[i][j][k][h]$表示第一次在上面取$i$个下面取$j$个,第二次在上面取$k$个下面取$h$个的方案数

等等$n^4$根本开不下+过不去啊=。=

发现$i,j,k$固定时$h$可以算出来,于是少一个$n$的复杂度

建议填表转移,每次从$dp[i][j][k]$转移过去,所以如果空间不够就把$i$滚掉

提示:被卡常的尝试统计的时候判一下是否有值就能过了。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=510,mod=1024523;
 6 int n,m,noww,last,dp[2][N][N];
 7 char a[N],b[N];
 8 void Mod(int &x)
 9 {
10     if(x>=mod) x-=mod;
11 }
12 int main()
13 {
14     register int i,j,k;
15     scanf("%d%d%s%s",&n,&m,a+1,b+1);
16     dp[0][0][0]=noww=1;
17     for(i=0;i<=n;i++)
18     {
19         memset(dp[noww],0,sizeof dp[noww]);
20         for(j=0;j<=m;j++)
21             for(k=0;k<=n;k++)
22             {
23                 int h=i+j-k,las=dp[last][j][k];
24                 if(h>=0&&h<=m&&las)
25                 {
26                     if(a[i+1]==a[k+1]) Mod(dp[noww][j][k+1]+=las);
27                     if(a[i+1]==b[h+1]) Mod(dp[noww][j][k]+=las);
28                     if(b[j+1]==b[h+1]) Mod(dp[last][j+1][k]+=las);
29                     if(b[j+1]==a[k+1]) Mod(dp[last][j+1][k+1]+=las);
30                 }
31             }
32         last=noww,noww^=1;
33     }
34     printf("%d",dp[noww][m][n]);
35     return 0;
36 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10222142.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值