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. 最大上升子序列和的主要内容,如果未能解决你的问题,请参考以下文章