1016. 最大上升子序列和

Posted caifxh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1016. 最大上升子序列和相关的知识,希望对你有一定的参考价值。

状态表示:

\\(f(i)\\)表示考虑前\\(i\\)个元素,且选第\\(i\\)个数的情况下, 最长上升子序列和的最大值。

状态转移:

\\[f(i)=\\max(f(i),f(j)+a_i),a_j < a_i \\]

边界:

\\[f(0)=0 \\]

注意点

\\(f(i)\\)初值设为\\(a_i\\),表示仅选定当前元素,最长上升子序列和为\\(a_i\\)

const int N = 1010;
int f[N];
int a[N];
int n;

int main()
{
    cin>>n;
    
    for(int i=1;i<=n;i++) cin>>a[i];
    
    int res=0;
    for(int i=1;i<=n;i++)
    {
        f[i]=a[i];
        for(int j=1;j<i;j++)
            if(a[j] < a[i])
                f[i]=max(f[i],f[j]+a[i]);
        res=max(res,f[i]);
    }
    
    cout<<res<<endl;
    
    return 0;
}

状态表示:

\\(f(i,0)\\)表示考虑前\\(i\\)个元素,且不选第\\(i\\)个数的情况下, 最长上升子序列和的最大值。

\\(f(i,1)\\)表示考虑前\\(i\\)个元素,且选第\\(i\\)个数的情况下, 最长上升子序列和的最大值。

状态转移:

\\[f(i,0)=\\max(f(i-1,0),f(i-1,1)) \\\\ f(i,1)=\\max(f(i,1),f(j,1)+a_i),a_j < a_i \\]

边界:

\\[f(0,0)=f(0,1)=0 \\]

const int N = 1010;
int f[N][2];
int a[N];
int n;

int main()
{
    cin>>n;
    
    for(int i=1;i<=n;i++) cin>>a[i];
    
    for(int i=1;i<=n;i++)
    {
        f[i][0]=max(f[i-1][0],f[i-1][1]);
        
        f[i][1]=a[i];
        for(int j=1;j<i;j++)
            if(a[j] < a[i])
                f[i][1]=max(f[i][1],f[j][1]+a[i]);
    }
    
    cout<<max(f[n][0],f[n][1])<<endl;
    
    return 0;
}

以上是关于1016. 最大上升子序列和的主要内容,如果未能解决你的问题,请参考以下文章

代码题(25)— 最大子序和最长上升子序列

最大上升子序列和

最大上升子序列和

最大上升子序列,最大下降子序列,最大非增子序列

[北大机试D]:最大上升子序列和

[树状数组] aw3662. 最大上升子序列和(LIS优化+树状数组+离散化+好题+aw周赛003_3)