做過的題目分析
一.
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.問題分類 總的來說這些都是揹包問題 第乙個問 就是乙個完全揹包,揹...