1 条题解
-
3
【题目大意】从 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
信息
- ID
- 579
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 69
- 已通过
- 17
- 上传者