#渣渣的自我救赎#
最大上升子序列和
#include<iostream>
using namespace std;
#include<string.h>
int num[1000010];
int maxnum[1000010];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int i,j;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
int s;
memset(maxnum,sizeof(maxnum),0);
//maxnum[0]=num[0];
for(i=0;i<n;i++)
{
s=-3000000;
for(j=0;j<i;j++)
{
if(num[i]>num[j]&&s<maxnum[j])
s=maxnum[j];
}
maxnum[i]=num[i]+s;
}
int ans=-30000000;
for(i=0;i<n;i++)
ans=max(ans,maxnum[i]);
printf("%d\n",ans);
}
return 0;
}
这是一个死活也过不了的代码
#include<iostream>
using namespace std;
#include<string.h>
int num[1000010];
int maxnum[1000010];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int i,j;
for(i=0;i<n;i++)
scanf("%d",&num[i]);
int s;
memset(maxnum,sizeof(maxnum),0);
maxnum[0]=num[0];
for(i=1;i<n;i++)
{
s=-3000000;
for(j=0;j<i;j++)
{
if(num[i]>num[j]&&s<maxnum[j])
s=maxnum[j];
}
if(s<0)
s=0;
maxnum[i]=num[i]+s;
}
int ans=-30000000;
for(i=0;i<n;i++)
{
ans=max(ans,maxnum[i]);
//cout<<maxnum[i]<<endl;
}
//if(ans>0)
printf("%d\n",ans);
//else
//printf("0\n");
}
return 0;
}
这是一个可以过掉的代码。
这是因为有可能前方没有比当前的数小的数,那么s的值就会是-300000,但其实s的值应该是0,有些代码就把输入数组从1开始,然后测试的时候j从0开始,保证会有一个数使得s的值不是负无穷,但是我觉得这个代码是有问题的。
#include<iostream>
using namespace std;
#include<string.h>
int num[1000010];
int maxnum[1000010];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int i,j;
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
int s;
memset(maxnum,sizeof(maxnum),0);
//maxnum[0]=num[0];
for(i=1;i<=n;i++)
{
s=-3000000;
for(j=0;j<i;j++)
{
if(num[i]>num[j]&&s<maxnum[j])//这里有的时候num[j]是没有值的
s=maxnum[j];
}
maxnum[i]=num[i]+s;
}
int ans=-30000000;
for(i=1;i<=n;i++)
{
ans=max(ans,maxnum[i]);
cout<<maxnum[i]<<endl;
}
printf("%d\n",ans);
}
return 0;
}