CF Beta Round #89 (Div. 2) - Caesar's Legions

来源:互联网 发布:推荐一部电影 知乎 编辑:程序博客网 时间:2024/06/05 08:58

 

题目地址:  http://codeforces.com/problemset/problem/118/D

 

这题记住的方法,主要是多加一维,用于区分士兵兵种。

 

而后枚举每一种可能长度,接在其它兵种后面,于是不会有超过限制的连续长度。

 

 

 

#include<iostream>#include<cstdio>using namespace std;int dp[110][110][2]={0};const int mod=100000000;int main(){int n1,n2,k1,k2;int i,j,k;scanf("%d%d%d%d",&n1,&n2,&k1,&k2);dp[0][0][0]=dp[0][0][1]=1;// 用最后一维,0和1来记录当前dp[i][j]的最后士兵 for(i=0;i<=n1;i++)for(j=0;j<=n2;j++){for(k=1;k<=k1 && k<=i;k++)dp[i][j][0]=(dp[i][j][0]+dp[i-k][j][1])%mod;// 为0的士兵 可以有 1~k1 等不同长度,然后接在为 为1的士兵 后面。 for(k=1;k<=k2 && k<=j;k++)dp[i][j][1]=(dp[i][j][1]+dp[i][j-k][0])%mod;}printf("%d\n",(dp[n1][n2][0]+dp[n1][n2][1])%mod);return 0;}