bzoj 1037 [ZJOI2008]生日聚会Party(DP)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1037
【题意】
一排n男m女,求满足任意连续段男女人数之差不超过k的数目。
【思路】
DP
设f[a][b][c][d]表示a男b女,男生女生人数最大差为c,女生男生人数最大差为d的方案数,则有转移方程:
f[a+1][b][c+1][max(d-1,0)]<-f[a][b][c][d]
f[a][b+1][max(c-1,0)][d+1]<-f[a][b][c][d]
太神辣 -<
【代码】
1 #include<cstdio> 2 #include<iostream> 3 #define FOR(a,b,c) for(int a=b;a<=c;a++) 4 using namespace std; 5 6 const int N = 200; 7 const int MOD = 12345678; 8 9 int f[N][N][25][25]; 10 int n,m,K; 11 12 int main() 13 { 14 scanf("%d%d%d",&n,&m,&K); 15 f[0][0][0][0]=1; 16 FOR(a,0,n) FOR(b,0,m) 17 FOR(c,0,K) FOR(d,0,K) 18 if(f[a][b][c][d]) { 19 if(a<n&&(c<K)) { 20 f[a+1][b][c+1][max(d-1,0)]=(f[a+1][b][c+1][max(d-1,0)]+f[a][b][c][d])%MOD; 21 } 22 if(b<m&&d<K) { 23 f[a][b+1][max(c-1,0)][d+1]=(f[a][b+1][max(c-1,0)][d+1]+f[a][b][c][d])%MOD; 24 } 25 } 26 int ans=0; 27 FOR(c,0,K) FOR(d,0,K) 28 ans=(ans+f[n][m][c][d])%MOD; 29 printf("%d\n",ans); 30 }
posted on 2016-03-11 09:05 hahalidaxin 阅读(253) 评论(0) 编辑 收藏 举报