トピックBaiduの。
別の説明の多くを読む(効果がほとんどですが、私はいくつかのquqを理解していないことをあまりにも弱いそうだったが)
私はこの質問には、以下のキーポイントを持っていると思います。
-
質問の明確な意味は、その本質を理解するために、ある、見つけるための列の最長非増加数を
-
このカードは私の長いポイントは、どのようにDP使用するには?
すべての2.1まず、あなたはフロントからバックに見れば、最初の数字で始まる、(再びすべて試していない限り)最適解を取得する方法を決定することがより困難である
2.2あなたが後ろから見ると、それぞれを取るためには番号が最小限であると仮定し、このような9 7 6 8 4などの音良いが、簡単に混乱データであり、 9 5 3 1、 フォワードバックステップを取るために、ヘッドは、それが最初の9上に載るようになっているときに誤解されているように、それがOKではありません
2.3すべての位置とサイクル数は、それを更新するペースを維持する場合は?
参照の現在の数であり、背面から前面への最長増加するシーケンスを見つける(、さらに開口ANSアレイは[]そのフロント長いシーケンスで各番号を記録するために使用される基が一緒にビーズのような同じ文字列とすることができるように構成することができますグループは、単語間の関係をエンドツーエンドを満たしている場合)。
コードは以下の通りであります:
#include<cstdio>
#include<cstring>
int num[51],ans[51];
int main(){
int i,j,n,max;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
//求最长非递增子序列
memset(ans,0,sizeof(ans));
for(i=0;i<n;i++){
ans[i]=1;
for(j=0;j<n;j++){
if(num[i]<num[j]&&ans[i]<ans[j]+1){//保证了从大到小的顺序同时衔接上不同长度段
ans[i]=ans[j]+1;
}
}
if(i==0){
max=ans[0];
}else if(ans[i]>max){
max=ans[i];
}
}
printf("%d",max);
}
出力が答えです。