最優子序列(c++)
阿新 • • 發佈:2022-04-01
參考:https://blog.csdn.net/qq_37630072/article/details/78133235
#include<cstdio>
#include<algorithm> //這個標頭檔案可以使用max(,),*max_element(,)
using namespace std; //它們的含義分別是:求兩者最大;求陣列最大
int n,a[1002],f[1002];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]); //輸入
f[i]=1; //以第i個數為末尾的上升序列最初長度為1
}
for(int i=1;i<=n;i++) //列舉i的位置
for(int j=1;j<i;j++) //在i的前面找j的位置
if(a[i]>a[j]) //如果滿足條件,則第i個數可以放在j後邊
f[i]=max(f[j]+1,f[i]);//取較大的一種再放
printf("%d",*max_element(f+1,f+n+1));//從 F[1]到F[n] 找最大值
return 0;
}
對於一串陣列,逐個選取,作為子串的最末(最大值)
類似於一個巢狀,即,例如:在第五個選到第四個可以排在前面,第四個可以排在前面的第三個被套進來,第三個可以排在前面的第一個再被套進來;每次只選取可排在前面的一個,即先做整個陣列的遍歷,再做選取的之前的子序遍歷。