線性dp 區間dp

2022-08-13 22:54:08 字數 3115 閱讀 7905

1>尼克的任務

額一道挺水的題,愣是做了幾個小時

動態規劃大致的思路還是找乙個轉移

換個詞就是影響

我們可以明顯看出本題的規則:

空暇時,一遇到任務必須挑乙個接

求1-n時間內最大空暇時間

所以將任務排序是必要的,兩個關鍵字

再來想象一下當我做到第i

個任務時,我在

st[i]-

(st[i]+t[i]-1

)時必然在工作

那麼1-(st[i]+t[i]-1)

的區間內,

是我上乙個任務的

f[j]和與j

任務之間的時間空暇決定的

則現在的問題是,找出所以合法

j任務,然後加上

st[i]-st[j]-t[j]

合法的j

任務應該滿足什麼要求呢

st[i]

之前已經完成,但是又不能已經完成了太久

這個不能完成太久的條件,其實正著推最容易,

就是j+1

任務往後數,最先開始的那個就是,

所以我們需要乙個新陣列,預處理這個最先開始

當然其實我可以不要這個陣列

只要每個當前任務點,去更新後面的任務點

#include#include

#include

#include

using

namespace

std;

intm,n;

const

int n=10003

;struct

node

}d[n];

intf[n];

intmain()

}printf(

"%d\n

",f[n]);

return0;

}

//

倒序做//

為什麼?

#include#include

#include

#include

using

namespace

std;

intm,n;

const

int n=10003

;vector

t[n];

intf[n];

intmain()

for(int j=0;j)

}printf(

"%d\n

",f[1

]);

return0;

}

2>相似基因

#include#include

#include

#include

using

namespace

std;

intn1,n2;

const

int n=103

;char

s1[n],s2[n];

intd1[n],d2[n];

const

int tab[5][5]=,,,

,};int

f[n][n];

intmain()

for(int i=1;i<=n2;i++)

memset(f,-0x3f,sizeof

(f));

f[0][0]=0;for(int i=1;i<=n2;i++) f[0][i]=f[0][i-1]+tab[d2[i]][4

];

for(int i=1;i<=n1;i++) f[i][0]=f[i-1][0]+tab[d1[i]][4

];

for(int i=1;i<=n1;i++)

for(int j=1;j<=n2;j++)

printf(

"%d\n

",f[n1][n2]);

return0;

}

3>分離與合體

就是把單點合併起來,求最值

比較有特色的,就是最後的方案輸出:

lyd 請你程式設計求出最終可以獲得的最大總價值,

並按照分離階段從前到後,區域從左到右的順序,輸出發生分離區域編號。若有多種方案,選擇分離區域盡量靠左的方案(也可以理解為輸出字典序最小的)。

例如先列印一分為二的區域,然後從左到右列印二分為四的分離區域,然後是四分為八的……

我用的是queue去bfs

#include#include

#include

using

namespace

std;

const

int n=303

;int

n,d[n],f[n][n],pth[n][n];

int max(int a,int

b)struct

node

node(){}

};void get_path(int l,intr)}

intmain()

printf(

"%d\n

",f[1

][n]);

get_path(

1,n);

return0;

}

4>加分二叉樹

一道披著樹形dp外皮的區間dp

#include#include

#include

#define ll long long

using

namespace

std;

intn;

const

int n=33

;int

pth[n][n];

ll d[n],f[n][n];

ll max(ll a,ll b)

void get_path(int l,intr)}

intmain()

else

if(f[i][j]f[i][j]=t1,pth[i][j]=i;

for(int k=i+1;k)

}printf(

"%lld\n

",f[1

][n]);

get_path(

1,n);

return0;

}

區間 線性dp 數字遊戲

丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共 n 個 你要按順序將其分為 m 個部分,各部分內的數字相加,相加所得的 m 個結果對 10 取模後再相乘,最終得到乙個數 k 遊戲的...

線狀DP及區間DP

這裡我們都用到動態規劃的思想 dynamic programming,簡稱dp。本質就是組合子問題來求解原問題,且對每個子問題只求解一次。一般來說四個步驟 1.刻畫乙個最優結構特徵 2.遞迴的定義最優解值 3.計算最優解的值 4.利用計算出的資訊構造乙個最優解 這邊直接給出 include incl...

DP基礎(線性DP)總結

前言 雖然確實有點基礎.但凡事得腳踏實地地做,基礎不牢,地動山搖,嗯!dp方程 dp i max 複雜度 o n 2 法一 資料結構無腦暴力優化 以a i 為陣列下標,從1到a i 訪問最大值,再加一,進行更新 法二 設h k 表示dp值為k的最長上公升子串行的最小值 有點貪心在裡面 顯然h k h...