注意點:1、其實就是講所有走每一步的時候求大致值就好,然後這個值又會對下面進行影響,就像自己思考問題一樣
2、然後就是需要注意一下邊界問題,因為我們這邊求最大值,所以需要對邊界進行初始化
最長上公升子串行理解:1、有一說一,樣板題,很快就容易,就是當前這個值可以由前面**轉過來然後max最大長度就行,++就好
最長上公升子串行二思考:1、資料量增大的下我們是無法兩重迴圈的,所以得優化,
2、不難發現沒有優化的時候我們是需要列舉出我們是從**轉過來,然後繼續求max
3、如果我們要是能夠知道_i_前面的數字的最小值的話,豈不是直接查詢當前這個值就好了,不需再進行列舉了
4、所以,這裡f陣列的含義發生了改變,存的是前面i個數最長上公升子串行結尾的最小值
#include #include #include #include #include #include #include #include #include #include #include #include #include #define pub(n) push_back(n)之後就是還有乙個最長公共子串行,感覺trie演算法更好一點,就不寫了#define pob(n) pop_back(n)
#define sf(n) scanf("%d",&n)
#define pf(n) printf("%d\n",n)
#define slf(n) scanf("lld",&n)
#define plf(n) printf("lld\n",&n)
#define rep(i,a,b) for(int i = a; i <= b ; i ++ )
#define pre(i,a,b) for(int i = a ; i >= b ; i --)
#define ll long long
#define pii pair#define inf 0x3f3f3f3f3f3f3fll
#define ull unsigned long long
#define ios ios::sync_with_stdio(false),cin.tie(0)
using namespace std;
const int n = 2e6+10,mod=1e9+7;
int n;
int a[n];
int f[n];
int main()
len=max(len,r+1);
f[r+1]=a[i];
}pf(len);
return 0;
}
DP基礎(線性DP)總結
前言 雖然確實有點基礎.但凡事得腳踏實地地做,基礎不牢,地動山搖,嗯!dp方程 dp i max 複雜度 o n 2 法一 資料結構無腦暴力優化 以a i 為陣列下標,從1到a i 訪問最大值,再加一,進行更新 法二 設h k 表示dp值為k的最長上公升子串行的最小值 有點貪心在裡面 顯然h k h...
AcWing 274 移動服務 線性DP
乙個公司有三個移動服務員,最初分別在位置1,2,3處。如果某個位置 用乙個整數表示 有乙個請求,那麼公司必須指派某名員工趕到那個地方去。某一時刻只有乙個員工能移動,且不允許在同樣的位置出現兩個員工。從 p 到 q 移動乙個員工,需要花費 c p,q 這個函式不一定對稱,但保證 c p,p 0。給出n...
acwing 274 移動服務(線性dp)
乙個公司有三個移動服務員,最初分別在位置1,2,3處。如果某個位置 用乙個整數表示 有乙個請求,那麼公司必須指派某名員工趕到那個地方去。某一時刻只有乙個員工能移動,且不允許在同樣的位置出現兩個員工。從 p 到 q 移動乙個員工,需要花費 c p,q 這個函式不一定對稱,但保證 c p,p 0。給出n...