1 solutions
-
0
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; typedef long long LL; int a[N],b[N]; LL f[N]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { cin>>b[i]; } LL ans=0; for(int i=n;i>=1;i--) { LL maxv=0; for(int j=i+b[i];j<=n;j++) { maxv=max(maxv,f[j]); } f[i]=maxv+a[i]; ans=max(ans,f[i]); } cout<<ans; return 0; }使用后缀优化
#include<bits/stdc++.h> using namespace std; const int N=2e5+10; typedef long long LL; int a[N],b[N]; LL f[N],g[N]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { cin>>b[i]; } LL ans=0; for(int i=n;i>=1;i--) { LL maxv=0; int start=max(i+1,i+b[i]); if(start<=n) { maxv=g[start]; } f[i]=maxv+a[i]; ans=max(ans,f[i]); g[i]=max(f[i],g[i+1]); } cout<<ans; return 0; }O(n)解法,需要往后传递属性
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; typedef long long LL; int a[N],b[N]; LL f[N]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { cin>>b[i]; } LL ans=0; for(int i=1;i<=n;i++) { ans=max(ans,f[i]+a[i]); if(i+b[i]<=n) { f[i+b[i]]=max(f[i+b[i]],f[i]+a[i]); } f[i+1]=max(f[i+1],f[i]); } cout<<ans; return 0; }
- 1
Information
- ID
- 3067
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 9
- Accepted
- 2
- Uploaded By