題解 | #牛牛吃草#
牛牛吃草
http://www.fangfengwang8.cn/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; }
動態(tài)規(guī)劃,dp[i]表示在i停止時(shí),最多可以吃多少。對于每個(gè)dp[i],只需要遍歷之前的dp[j] (j<i),對于能走到i的那些(即滿足(i-j)%a[j]==0),記錄他們的最大值,該最大值+w[i]即為dp[i]。這里其實(shí)不需另設(shè)dp,直接將w數(shù)組用作dp數(shù)組即可。