Hdu 1257 LIS攔截系統 最大上升子序列或動態規劃
阿新 • • 發佈:2018-11-08
語言表達能力欠佳。。。
思路一:依次遞減序列的最小個數其實就是求最大上升子序列
思路二:正常思路:開始所有的(就是dp陣列)都預設為使用系統1,a[i]>a[j](0<j<i)dp[i]=max(dp[i],dp[j]+1).
例如 4 8 100 6 3
當i遍歷到第最後一個的時候,對於系統1,如果a[i]<系統1的最小高度,就會被攔截。a[i]就一定會是比系統2的最小高度要小(即是3>100),因為如果前面是2(2<3),2一定會比3先被系統1攔截
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define maxn 100000 int a[maxn]; int dp[maxn]; int main() { int N; while(EOF!=scanf("%d",&N)) { int i,j; for(i=0;i<N;i++){ scanf("%d",&a[i]); dp[i]=1; } for(i=0;i<N;i++){ for(j=0;j<i;j++){ if(a[i]>a[j]){ dp[i]=max(dp[i],dp[j]+1); } } } int Max=0; for(i=0;i<N;i++){ Max=max(dp[i],Max); } cout << Max << endl; } return 0; }