没有AC它,但是我已经试过很多例子了,都通过,所以放弃做它了,贴上我的错误代码,这道题目要注意它的数值,150000啊,时限又是1秒,也就是10的9次方,如果你用了两重循环,可想而知,超过那个最大值,所以只能有一重循环,dp中一重循环的,我只有在最大非递增序列看到,还有那道hehe中见到,所以我尝试了一下跟hehe的算法,时间上符合题目的要求了,可是还是通不过,蛋碎啊
#include "string.h" #include "iostream" using namespace std; int f[101000][510]; int n,num[101000],list[500],count=0; int max(int a,int b){return a>b?a:b;} void numtoarray(int array[],int a){ int i=0,j; while(a>0){ array[i++]=a%10; a=a/10; } if(count>i){ for(j=i;j<=count;j++)array[j]=0; } else count=i; //count=max(count,i); } void work(){ int i,flag,j,top=2,data; memset(f,0,sizeof(f)); numtoarray(f[1],num[1]); //for(j=1;j<=n;j++)cout<<j<<' '<<num[j]<<endl;cout<<endl; for(i=2;i<=n;i++){ if(num[i]>num[i-1]){ data=num[i]-num[i-1]; numtoarray(list,data); flag=0; //cout<<"data "<<data<<endl; //cout<<"list ";for(j=count-1;j>=0;j--)cout<<list[j];cout<<endl; for(j=0;j<count;j++){ f[top][j]=f[top-1][j]+list[j]+flag; flag=f[top][j]/10; f[top][j]=f[top][j]%10; } if(flag!=0){ f[top][j]=flag; count++; } //cout<<i<<' ';for(j=count-1;j>=0;j--)cout<<f[top][j];cout<<endl; top++; } //cout<<"* ";cout<<i<<' ';for(j=count-1;j>=0;j--)cout<<f[i][j];cout<<endl; } //for(i=1;i<top;i++)cout<<f[i]<<' ';cout<<endl; for(i=count-1;i>=0;i--)cout<<f[top-1][i];cout<<endl; } int main(){ int i; cin>>n; for(i=1;i<=n;i++){ cin>>num[i]; } work(); }