線性dp解題方法

2021-10-04 18:44:21 字數 2032 閱讀 8016

做過的題目分析

一.

1.設f[i][j]是蟲子經過i分鐘到達第j棵數的方法數;

2.f[i][j]儲存的值是方法數;

3.對最後一步,即所能到達f[i][j]的可能情況進行分析,當蟲子到達這棵樹的時候只能從左邊或者右邊到達,所以可以得到狀態轉移方程 f[i][j] = f[i-1][j+1] + f[i-1][j-1];

#include

#include

#include

using

namespace std;

const

int n =

110;

long

long f[n]

[n];

long

long n,p,m,t;

intmain()

cout << f[m]

[t]<< endl;

}}

二.

做題時的分析過程:

1.設f[i]到第i個時間段截止的最大**量;

2.f[i]儲存的值是最大**量;

3.對最後一步,即所能到達f[i]的可能情況進行分析,對於到達第i個時間段有兩種情況,**,不**,並且存在判斷條件即開始時間是否在休息時間當中,所以狀態轉移方程 if(a[j].end + r <= a[i].start); f[i] = max(f[i],f[j]+a[i].val);

#include

#include

using

namespace std;

const

int n =

1010

;struct node

;bool

cmp(node a, node b)

node a[n]

;int f[n]

;int n,m,r;

intmain()

//cout << f[i] << endl;

maxx =

max(maxx,f[i]);

} cout << maxx << endl;

return0;

}

三.

做題時的分析過程:

1.設f[i]是到第i個人買票所需要的做時間;

2.f[i]儲存的值是買票的總時間;

3.對最後一步,即所能到達f[i]的可能情況進行分析,對於到達第i個人買票存在兩種情況,乙個人買票,和前乙個人一起買票就是兩個人買票,狀態轉移方程

f[i] = min(f[i-1]+yi[i],f[i-2]+er[i]);

#include

#include

using

namespace std;

const

int n =

2020

;int f[n]

;int yi[n]

,er[n]

;int t,k;

intmain()

return0;

}

1.根據題意確定f陣列(一二三四……維)下標的含義;

2.確定f陣列儲存的值的含義;

3.分析最後一步,即到達最後一步的可能情況,最後根據情況列狀態轉移方程。

TVYJ1061 解題報告(線性DP)

題意簡述 乙個公司有三個移動服務員。如果某個地方有乙個請求,某個員工必須趕到那個地方去 那個地方沒有其他員工 某一時刻只有乙個員工能移動。被請求後,他才能移動,不允許在同樣的位置出現兩個員工。從p到q移動乙個員工,需要花費c p,q 這個函式沒有必要對稱,但是c p,p 0。公司必須滿足所有的請求。...

樹形DP題型解題方法總結

一般樹形dp是先進行dfs,搜尋到最深層的狀態,然後再慢慢的回溯過來,把後面的狀態一路繼承過來,再更新父節點的答案 一般關於節點擊取的題型狀態轉移方程 這種適用于父節點擊時,子節點不能選的情況,記得最後加上當前節點本身的價值 這種適用于父節點不選時,子節點必須選的情況 3.適用於當節點x進行某種操作...

整數劃分解題報告(DP方法)

1.問題描述 給定乙個正整數n和k 1.將n劃分成若干正整數之和的劃分數。2.將n劃分成k個正整數之和的劃分數。3.將n劃分成最大數不超過k的劃分數。4.將n劃分成若干奇正整數之和的劃分數。5.將n劃分成若干不同整數之和的劃分數。2.問題分類 總的來說這些都是揹包問題 第乙個問 就是乙個完全揹包,揹...