sdut 3565 Feed the monkey (有限制 (2)dp)-------C语言—菜鸟级

举报
Fivecc 发表于 2022/08/05 23:45:05 2022/08/05
【摘要】 1642: 题目 D Feed the monkey 题目描述 爱丽丝有一只猴子,她必须每天给猴子喂水果。她有三种水果,香蕉,桃子和苹果。每天,她都会选择三分之一, 然后选择其中一种喂猴子。但是猴子是...

1642: 题目 D Feed the monkey
题目描述

爱丽丝有一只猴子,她必须每天给猴子喂水果。她有三种水果,香蕉,桃子和苹果。每天,她都会选择三分之一,

然后选择其中一种喂猴子。但是猴子是很挑剔的,它不希望香蕉连续吃超过D1天,桃子连续超过吃D2天,或苹果连续吃D3天以上。现在爱丽丝有N1香蕉,N2桃子和N3。苹果,请帮她计算一下喂猴子的计划。

现在爱丽丝有N1香蕉,N2桃子和N3。苹果,请帮她计算一下喂猴子的计划。

输入

多个测试用例。第一行包含一个整数T (T<=20),表示测试用例的数量。

每个测试用例是一个包含6个整数N1、N2、N3、D1、D2、D3 (N1、N2、N3、D1、D2、D3<=50)。

输出

输出一行。在(N1+N2+N3)天内喂养猴子的计划数目。答案太大了,所以你应该对1000000007取模。

样例输入
1
2 1 1 1 1 1

样例输出
6

#include<stdio.h>
#include<string.h>
#define N 51
#define MOD 1000000007
#define min(a,b) a>b?b:a
typedef long long ll;
int main()
{  int T,n1,n2,n3,x1,x2,x3;
   long int dp[N][N][N][4]; int tem,i,j,k,s;
    scanf("%d",&T);
    while(T--)
    { ll ans=0;
        memset(dp,0,sizeof(dp));
     scanf("%d%d%d%d%d%d",&n1,&n2,&n3,&x1,&x2,&x3);
            for(i=n1;i>=0;i--)
            for(j=n2;j>=0;j--)
            for(k=n3;k>=0;k--)
            {   tem=min(i,x1);
                for(s=1;s<=tem;s++)
                 if(i==n1&&j==n2&&k==n3)dp[i-s][j][k][1]=(dp[i][j][k][1]+1)%MOD;
                 else dp[i-s][j][k][1]=(dp[i-s][j][k][1]+(dp[i][j][k][2]+dp[i][j][k][3])%MOD)%MOD;
                 tem=min(j,x2);
                for(s=1;s<=tem;s++)
                 if(i==n1&&j==n2&&k==n3)dp[i][j-s][k][2]=(dp[i][j][k][2]+1)%MOD;
                 else dp[i][j-s][k][2]=(dp[i][j-s][k][2]+(dp[i][j][k][1]+dp[i][j][k][3])%MOD)%MOD;
                tem=min(k,x3);
                for(s=1;s<=tem;s++)
                 if(i==n1&&j==n2&&k==n3)dp[i][j][k-s][3]=(dp[i][j][k][3]+1)%MOD;
                 else dp[i][j][k-s][3]=(dp[i][j][k-s][3]+(dp[i][j][k][1]+dp[i][j][k][2])%MOD)%MOD;
            }
            ans=(dp[0][0][0][1]+dp[0][0][0][2]+dp[0][0][0][3])%MOD;
            printf("%lld\n",ans);
    }
    return 0;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
#include<stdio.h>
#include<string.h>
#define N 51
#define MOD 1000000007
typedef long long ll;
int vis[N][N][N][N][3];int x1,x2,x3,tem;
int DFS(int n1,int n2,int n3,int cot,int lost)
{    
    if(cot==0||n1<0||n2<0||n3<0)return 0;
    if(vis[n1][n2][n3][cot][lost]!=-1)return vis[n1][n2][n3][cot][lost];
	if(n1+n2+n3==0)return vis[n1][n2][n3][cot][lost]=1;
     ll ans=0;int t[3]={0};t[lost]=cot;
	 if(t[0]<x1)ans=DFS(n1-1,n2,n3,t[0]+1,0)%MOD;
     if(t[1]<x2)ans=(ans+DFS(n1,n2-1,n3,t[1]+1,1))%MOD;
     if(t[2]<x3)ans=(ans+DFS(n1,n2,n3-1,t[2]+1,2))%MOD;
	return vis[n1][n2][n3][cot][lost]=ans;
}
int main()
{  int T, n1,n2,n3;
	scanf("%d",&T);
	while(T--)
	{ ll ans=0;
	memset(vis,-1,sizeof(vis));
		 scanf("%d%d%d%d%d%d",&n1,&n2,&n3,&x1,&x2,&x3);
		 ans=DFS(n1-1,n2,n3,1,0)%MOD;
		 ans=(ans+DFS(n1,n2-1,n3,1,1))%MOD;
		 ans=(ans+DFS(n1,n2,n3-1,1,2))%MOD;
	    	printf("%lld\n",ans);
	}
	return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

文章来源: fivecc.blog.csdn.net,作者:Five-菜鸟级,版权归原作者所有,如需转载,请联系作者。

原文链接:fivecc.blog.csdn.net/article/details/80412805

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。