POJ 2533 Longest Ordered Subsequence 动态规划
題意
本題求從1 到 n的最長上升子序列的長度
分析
最優(yōu)化問題
考慮dp
我們求1-n最長上升子序列長度
假設(shè)記錄在dp[n]中
假設(shè)我們已經(jīng)知道了1—n-1的以第n-1為最后一個元素的最長上升序列的長度
那么我們拿到第n個元素不就可以判斷如果這個n比n-1位置上的元素大
那么就讓dp[n] = dp[n-1]+1不就可以了嗎
那么dp[n-1]又怎么得到
我們需要得到dp[n-2]
那么dp[n-2]咋知道 我們需要dp[n-3]。。。
所以我們不如從前面開始推
設(shè)置dp數(shù)組 dp[i]表示以第I個元素為結(jié)尾的從1到n最長上升子序列的長度
也就是我們要從第一個元素x開始向后掃
如果后面的元素比x大 那么就讓dp[I] = dp[1]+1;
那么這里我們看到需要把dp[i]全部都初始化為1
只有這樣才能得到正確累計的數(shù)量
可是我們發(fā)現(xiàn) 如果每個元素都做此相同步驟
我們需要考慮就是如果這個dp[i]本來就比dp[枚舉元素]+1 大 我們就不能直接賦值了
因為這個元素可能已經(jīng)被前面的某些元素已經(jīng)搞得比較大了
所以我們得到最終的遞推關(guān)系
dp[j]=max(dp[j],dp[i]+1);
CODE
#include<bits/stdc++.h> using namespace std; int a[1010],dp[1010];int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);dp[i]=1;}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(a[j]>a[i])dp[j] = max(dp[i]+1,dp[j]);}}int ans=-1;for(int i=1;i<=n;i++){ans = max(dp[i],ans);}printf("%d\n",ans);return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的POJ 2533 Longest Ordered Subsequence 动态规划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fasttext的基本使用 java 、
- 下一篇: cad 打开硬件加速卡_CAD:“你的图