1 条题解

  • 3
    @ 2024-6-13 12:04:28

    【题目大意】从 0 关出发,每次都有 m 种选择,选的的第 i 个关卡,到达的下一个关卡是 0+ mi。当关卡的总和大于等于 N 的时候,便停止游戏。注意,离开第 i 个关卡,可以获得关卡的分数。

    【考纲知识点】循环知识,动态规划

    【解题思路】可以考虑动态规划。每关都是一个阶段,每关增加的都是一个正数,关数增加是单向的。保存好某个阶段的状态,因为是离开才能获得分数,因此不能加上当前关卡的分数。可求出所有阶段的最值,因为可能存在某关是负值,要求出所有状态的最大值。

    #include <bits/stdc++.h>
    using namespace std;
    const int N=10005,M=105,inf=1e9;
    int a[M],b[N],dp[N];
    int main()
    {
    	
    	int n,m;
    	cin>>n>>m;
    	for (int i=1; i<=m; i++)
    	{
    		cin>>a[i];
    	}
    	for (int i=0; i<n; i++)
    	{
    		cin>>b[i];
    	}
        memset(dp,-0x3f,sizeof(dp));
    	dp[0]=0;
    	for (int i=1; i<n; i++)
    	{
    		for (int j=1; j<=m; j++)
    		{
    			if (i-a[j]>=0)
    			{
    				dp[i]=max(dp[i],dp[i-a[j]]+b[i-a[j]]);
    			}
    		}
    	}
    	int ans=-inf;
        for(int i=0;i<n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(i+a[j]>=n)
                {
                    ans=max(ans,dp[i]+b[i]);
                    break;
                }
            }
        }
    	cout<<ans;
    	return 0;
    }
    
    • 1

    [GESP202312 六级] 闯关游戏

    信息

    ID
    579
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    69
    已通过
    17
    上传者