最長不下降程式碼dp
阿新 • • 發佈:2020-07-25
我看以前寫過一個最長不下降,但是感覺可能沒有那麼好理解emmmm
下面這個是從正序尋找的emmmm
先來一個WA程式碼,我給寫了WA的具體行數,看看其他行其實可以看出它的思路
第二個程式碼是AC的
1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 #include <vector> 5 using namespace std; 6 long MAX=1010; 7 int a[1000]; 8 int maxa[1000]; 9 int pos[1000]; 10 intmain() { 11 int N; 12 cin >> N; 13 for (int i = 1; i <= N; ++i) { 14 cin >> a[i]; 15 maxa[i] = 1; 16 } 17 int maxfinal=0; 18 int final_pos=0; 19 for (int k = 2; k <= N; ++k) { 20 for (int i = k-1; i >=1; --i) { 21 if (a[k] > a[i]) {22 maxa[k] = max(maxa[k], maxa[i] + 1); 23 pos[k]=i;//WA典範,因為maxa可能沒有取maxa[i]的值,但是pos 一直在改變 24 if (maxa[k] > maxfinal) { 25 maxfinal = maxa[k]; 26 final_pos=k; 27 } 28 29 } 30 }31 } 32 cout<<maxfinal<<endl; 33 for (int l = 1; l < 5; ++l) { 34 cout<<pos[l]<<endl; 35 36 } 37 for (int j = final_pos; ; ) { 38 if(a[j]==0) 39 break; 40 cout<<a[j]<<" "; 41 j=pos[j]; 42 43 44 } 45 46 47 48 }
沒錯就是max(,)的下一行,但是如果只需要輸出長度的話就把這行給註釋掉就行了
1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 #include <vector> 5 using namespace std; 6 long MAX=1010; 7 int a[1000]; 8 int maxa[1000]; 9 int pos[1000]; 10 int main() { 11 int N; 12 cin >> N; 13 for (int i = 1; i <= N; ++i) { 14 cin >> a[i]; 15 maxa[i] = 1; 16 } 17 int maxfinal=0; 18 int final_pos=0; 19 for (int k = 2; k <= N; ++k) { 20 for (int i = k-1; i >=1; --i) { 21 int data; 22 if (a[k] > a[i]) { 23 if(maxa[k]<maxa[i] + 1) { 24 maxa[k] = maxa[i] + 1; 25 pos[k] = i; 26 if (maxa[k] > maxfinal) { 27 maxfinal = maxa[k]; 28 final_pos = k; 29 } 30 } 31 32 } 33 } 34 } 35 cout<<maxfinal<<endl; 36 for (int j = final_pos; ; ) { 37 if(a[j]==0) 38 break; 39 cout<<a[j]<<" "; 40 j=pos[j]; 41 42 43 } 44 45 46 47 }
這個是輸出序列的,那個存數方式還算很常用
還有就是,一維陣列比二維要快?我一會兒寫一篇來檢測一下哈