【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
生活随笔
收集整理的這篇文章主要介紹了
【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1566: [NOI2009]管道取珠
Time Limit:?20 Sec??Memory Limit:?650 MBSubmit:?1659??Solved:?971
Description
Input
第一行包含兩個整數n, m,分別表示上下兩個管道中球的數目。 第二行為一個AB字符串,長度為n,表示上管道中從左到右球的類型。其中A表示淺色球,B表示深色球。 第三行為一個AB字符串,長度為m,表示下管道中的情形。Output
僅包含一行,即為 Sigma(Ai^2) i從1到k 除以1024523的余數。Sample Input
2 1AB
B
Sample Output
5HINT
樣例即為文中(圖3)。共有兩種不同的輸出序列形式,序列BAB有1種產生方式,而序列BBA有2種產生方式,因此答案為5。?
【大致數據規?!?br />約30%的數據滿足 n, m ≤ 12;?
約100%的數據滿足n, m ≤ 500。
Source
?
?
?
【分析】
我真是超級蠢啊。。。想了很久都想不到。。。。
一直二維DP搞來搞去搞不了!!!
注意求的是ai^2的和 ?平方!!!
也就是說,可以看成,兩個人在取,問他們取出來的排列相同的方案有多少種。
那么本來的四維DP可以縮成三維,就直接遞推就好了。
?
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define Mod 1024523 8 #define Maxn 510 9 10 char s[Maxn]; 11 int a[Maxn],b[Maxn],f[Maxn][Maxn][Maxn]; 12 13 int main() 14 { 15 int n,m; 16 scanf("%d%d",&n,&m); 17 scanf("%s",s+1); 18 for(int i=1;i<=n;i++) a[i]=s[i]-'A';a[n+1]=10; 19 scanf("%s",s+1); 20 for(int i=1;i<=m;i++) b[i]=s[i]-'A';b[m+1]=100; 21 memset(f,0,sizeof(f)); 22 f[n][m][n]=1; 23 for(int i=n;i>=0;i--) 24 for(int j=m;j>=0;j--) 25 for(int k=n;k>=0;k--) 26 { 27 int l=i+j-k; 28 if(l<0||l>m||(i==n&&j==m)) continue; 29 // f[i][j][k]=0; 30 if(a[i+1]==a[k+1]) f[i][j][k]=(f[i][j][k]+f[i+1][j][k+1])%Mod; 31 if(a[i+1]==b[l+1]) f[i][j][k]=(f[i][j][k]+f[i+1][j][k])%Mod; 32 if(b[j+1]==a[k+1]) f[i][j][k]=(f[i][j][k]+f[i][j+1][k+1])%Mod; 33 if(b[j+1]==b[l+1]) f[i][j][k]=(f[i][j][k]+f[i][j+1][k])%Mod; 34 } 35 printf("%d\n",f[0][0][0]); 36 return 0; 37 } View Code?
2017-04-01?09:57:53
轉載于:https://www.cnblogs.com/Konjakmoyu/p/6654682.html
總結
以上是生活随笔為你收集整理的【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSL 1760——商店选址问题(最短路
- 下一篇: 判断App是否安装