1 solutions

  • 0
    @ 2026-3-20 15:42:59

    n2解法,类似最长上升子序列n^2解法,类似最长上升子序列

    #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