HLG 1334 最好的心情[lis 变形]
Description |
俗话说“月有阴晴圆缺,人有悲欢离合。”。
虽然大家都没这么悲催,但是心情的波动在所难免。
MM的心情也会有波动,心情好心情值就高,心情不好心情值就低,每个小时都不一样,GG想知道MM最长的上升心情值的子序列,这样GG才好。。。
按时间先后给出n个小时的心情值e[i],GG要求一个最长的子序列,使得该子序列e1< e2<e3<e4..<ek,并且使得e1+e2+e3+..+ek的和最大。
|
Input |
有多组数据,对于每组数据,第一行是一个整数n(<=1000),接下来有n个整数ei。 |
Output |
每组数据输出一行,该行包含两个数,表示最长子序列的长度和子序列的和。 |
Sample Input |
5 5 4 4 4 9 |
Sample Output |
2 14 |
分析:最长单调子序列的变形 ,多加了一个要求就是求最长序列的前提下,找出最大和。
View Code
#include<stdio.h>
#include<string.h>
int main()
{
long long d[1001];
long long a[1001];
long long s[1001];
long long ans,res;
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
ans=res=0;
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
memset(d,0,sizeof(d));
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(a[j]<a[i])
{
if(d[j]>d[i])
{
s[i]=s[j];
d[i]=d[j];
}
else if(d[j]==d[i])
{
if(s[j]>s[i])
s[i]=s[j];
}
}
}
s[i]+=a[i];
d[i]++;
if(d[i]>res)
res=d[i];
}
for(i=1;i<=n;i++)
if(d[i]==res&&s[i]>ans)
ans=s[i];
printf("%lld %lld\n",res,ans);
}
return 0;
}