【题解】codeforces118D Caesar's Legion 线性DP

题目链接
使用状态dp[i][j][k],i,j:步兵,骑兵个数 k:0是步兵,1是骑兵
状态方程:for(int k = 1; k <= min(i,k1); k++)
dp[i][j][0] = (dp[i][j][0] + dp[i-k][j][1])%MOD;
for(int k = 1; k <= min(j,k2); k++)
dp[i][j][1] = (dp[i][j][1] + dp[i][j-k][0])%MOD;
类似于zoj3747

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n1,n2,k1,k2;
int dp[220][220][2];
#define MOD 100000000
//dp[i][j][k]已经用了i个步兵j个骑兵,k为0是步兵k为1是骑兵 
int main()
{
    //freopen("in.txt","r",stdin);
    int i,j,k;
    while(~scanf("%d%d%d%d",&n1,&n2,&k1,&k2))
    {
        memset(dp,0,sizeof(dp));
        for(i=0;i<=k1;i++)
        dp[i][0][0]=1;
        for(i=0;i<=k2;i++)
        dp[0][i][1]=1;
        for(i=1;i<=n1;i++)
        for(j=1;j<=n2;j++)
        {
            for(k=1;k<=min(i,k1);k++)
            dp[i][j][0]=(dp[i][j][0]+dp[i-k][j][1])%MOD;
            for(k=1;k<=min(j,k2);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;
}

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/81635570
今日推荐