1 条题解

  • 0
    @ 2026-8-7 0:35:19
    #include<bits/stdc++.h>
    using namespace std;
    int t[30],T[30],f[30],d[30];
    int dp[30][300];//dp[i][j]表示钓鱼的范围是1~i, 总时间是j(包含钓鱼和走路的时间) 
    int main()
    {
    	int n,h;scanf("%d%d",&n,&h);h=h*12;
    	for(int i=1;i<=n;i++) scanf("%d",&f[i]);
    	for(int i=1;i<=n;i++) scanf("%d",&d[i]);
    	t[1]=0;T[1]=0;for(int i=2;i<=n;i++)scanf("%d",&t[i]),T[i]=T[i-1]+t[i];
    	memset(dp,0,sizeof(dp));
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
            for(int j=T[i];j<=h;j++)
    		{
    			dp[i][j]=dp[i-1][j-t[i]];
    			int sfi=0,fi=f[i]; //sfi表示在第i个池塘花k分钟能钓到的鱼的数量 
    			for(int k=1;k<=j-T[i];k++)if(fi>0)//fi表示当前这一分钟能钓到的鱼的数量 
    			{
    				sfi+=fi;
    				dp[i][j]=max(dp[i][j],sfi+dp[i-1][j-t[i]-k]);
    				fi-=d[i];
    			}else break;    
            }
            ans=max(ans,dp[i][h]);//答案在dp[i][h]中,而不是只在dp[n][h]
        }
        printf("%d\n",ans);
        return 0;
    }
    【参考程序2】
    #include<bits/stdc++.h>
    using namespace std;
    int t[30],T[30],f[30],d[30];
    int dp[30][300];//dp[i][j]表示钓鱼的范围是1~i, 总时间是j(包含钓鱼和走路的时间) 
    int main()
    {
    	int n,h;scanf("%d%d",&n,&h);h=h*12;
    	for(int i=1;i<=n;i++) scanf("%d",&f[i]);
    	for(int i=1;i<=n;i++) scanf("%d",&d[i]);
    	t[1]=0;T[1]=0;for(int i=2;i<=n;i++)scanf("%d",&t[i]),T[i]=T[i-1]+t[i];
    	memset(dp,0,sizeof(dp));
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
            for(int j=T[i];j<=h;j++)
    		{
    			dp[i][j]=dp[i-1][j-t[i]];
    			for(int k=1;k<=j-T[i];k++)if(f[i]-(k-1)*d[i]>0)
    			{
    				dp[i][j]=max(dp[i][j],k*(f[i]+f[i]-(k-1)*d[i])/2+dp[i-1][j-t[i]-k]);
    			}else break;    
            }
            ans=max(ans,dp[i][h]);
        }
        printf("%d\n",ans);
        return 0;
    }
    
    • 1

    *【动态规划:状态设计DP】喂牛

    信息

    ID
    247
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    73
    已通过
    38
    上传者