题解 | #牛牛吃草#
牛牛吃草
https://www.nowcoder.com/practice/f05254f070944ff792c0dfefabd94fec
#include <iostream> #include <vector> using namespace std; int main() { int n; cin>>n; vector<int> w(n),a(n); for(int i=0;i<n;i++) cin>>w[i]; for(int i=0;i<n;i++) cin>>a[i]; int ans=w[0]; for(int i=1;i<n;i++){ int maxnum=0; for(int j=0;j<i;j++) if((i-j)%a[j]==0) maxnum=max(maxnum,w[j]); w[i]+=maxnum; ans=max(ans,w[i]); } cout<<ans<<endl; return 0; }
动态规划,dp[i]表示在i停止时,最多可以吃多少。对于每个dp[i],只需要遍历之前的dp[j] (j<i),对于能走到i的那些(即满足(i-j)%a[j]==0),记录他们的最大值,该最大值+w[i]即为dp[i]。这里其实不需另设dp,直接将w数组用作dp数组即可。