题目描述
有一批大朋友他们每人手上拿着一个数字,当然这个数字只有 1 位,也就是 0 到 9 之间。每个大朋友的分数为在他之前的最长不下降子序列中所有数之和。(这个序列必须以它作为结尾!)如有多个最长不下降子序列,那么取编号字典序最小的。现在告诉你有 n 个大朋友,以及他们各自的数字,请你求出他们每个人的分数。
输入格式
第一行,1 个数 n。
第二行,n 个数,分别表示每个人的数字。
输出格式
一行,n 个数,分别表示每个人的分数。
#include<iostream>
using namespace std;
int a[10010];
int dp[10010];
int sum[10010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sum[1]=a[1];
dp[1]=a[1];
cout<<sum[1]<<" ";
for(int i=2;i<=n;i++)//以i为结尾的LIS
{
int cnt;
for(int j=i-1;j>=1;j--)
{
if(a[i]>=a[j])
{
dp[i]=max(dp[i],dp[j]+1);
if(dp[j]+1==dp[i])
{
cnt=j;
}
}
else
{
dp[i]=max(dp[i-1],dp[i]);
// cout<<i<<":"<<j<<'\n';
}
}
sum[i]=sum[cnt]+a[i];
cout<<sum[i]<<" ";
}
// cout<<'\n';
// for(int i=1;i<=n;i++)
// {
// cout<<dp[i]<<" ";
// }
}