codeforces #118D (背包)

来源:互联网 发布:天狼星加密软件多少钱 编辑:程序博客网 时间:2024/04/30 14:34

题意:

给出n1个序列A,n2个序列B。A最多可以k1个连续,B最多可以k2个连续。问排列的数。

题解:

真的。。。。真的。。。。没想到是背包啊啊啊啊!!!啊啊 !!

走起!

大犇:"这种有固定资源,并且有离散化消耗的,一定要忘背包上靠。“

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<map>using namespace std;typedef __int64 lld;const int oo=0x3f3f3f3f;const lld OO=1e18;const int Mod=1e8;const int maxn=3000+5;lld dp[maxn][maxn][2];int min(int a,int b,int c){    return min(a,min(b,c));}int main(){    int n,m,k1,k2;    lld ans;    while(scanf("%d %d %d %d",&n,&m,&k1,&k2)!=EOF)    {        memset(dp,0,sizeof dp);        dp[0][0][0]=dp[0][0][1]=1;        for(int i=1;i<=n+m;i++)        {            for(int j=min(n,i);j>=1;j--)            {                for(int t=1;t<=j&&t<=k1;t++)                {                    if(i-j<=m)                        dp[i][j][0]=(dp[i][j][0]+dp[i-t][i-j][1]+Mod)%Mod;                }            }            for(int j=min(m,i);j>=1;j--)            {                for(int t=1;t<=j&&t<=k2;t++)                {                    if(i-j<=n)                        dp[i][j][1]=(dp[i][j][1]+dp[i-t][i-j][0]+Mod)%Mod;                }            }        }        ans=(dp[n+m][n][0]+dp[n+m][m][1]+Mod)%Mod;        printf("%I64d\n",ans);    }    return 0;}/***/





0 0
原创粉丝点击