dp稀爛也不是一天兩天了
我覺得我很有必要把做(chao)過的dp記錄下來啊... ...dp這種精細的東西真是太玄妙了。
慢慢來吧。只有思維足夠強大,才足以見題拆題。
編輯中... ...
樹形dp:
1.機械人採集金屬
分析:設 f[i][j] 為:遍歷完j的子樹,且剩下i個回到j的最小代價。特殊的,f[0][i]表示用乙個機械人走完所有節點再回來的代價,原因是每個點都必須且只能轉移一種對答案貢獻的狀態。
那麼狀態轉移方程就要分兩類討論。
初始化:f[i][x]=sigma(f[0][son_i]);
維護:f[i][k]=min(f[i][k],f[i-j][son_i]+f[j][son_i]+j*edge_val;
想想真的很妙啊。
#include #include #include #include #include #include #include #define ll long long int#define ls (x << 1)
#define rs (x << 1 | 1)
using namespace std;
const int n = 100010;
struct nodee[n];
int n,s,k,tot,head[n];ll f[21][n];
int gi()
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
}ll gl()
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
}inline void link(int u,int v,ll w)
; head[u]=tot;
}inline void dfs(int x,int fa)
}}int main()
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
}void pui(int x)
ll gl()
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
}inline void work1()
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
}void pl(ll x)
void pc()
ll gl()
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
}ll qpow(ll d,ll z)
int main()
pl(ans2);pc();pl(ans1);pc();pl(((m-ans1-ans2-1)%mod+mod)%mod);
return 0;
}
DP問題集 動態規劃試題
1.揹包問題 給定n種物品和一揹包。物品i的重量是wi,其價值為pi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 每個物品只有兩種選擇,要麼就是塞到包裡面,要麼就是不要了 當揹包剩餘容量為j時,如果第i件物品重量wi j時,必定是要不了的,如果wi 假設剩餘容量...
歷屆試題 波動數列 (動態規劃)
問題描述 觀察這個數列 1 3 0 2 1 1 2 這個數列中後一項總是比前一項增加2或者減少3。棟棟對這種數列很好奇,他想知道長度為 n 和為 s 而且後一項總是比前一項增加a或者減少b的整數數列可能有多少種呢?輸入格式 輸入的第一行包含四個整數 n s a b,含義如前面說述。輸出格式 輸出一行...
面試題,硬幣 動態規劃
題目描述 給定數量不限的硬幣,幣值為25分 10分 5分和1分,編寫 計算n分有幾種表示法。結果可能會很大,你需要將結果模上1000000007 示例1 輸入 n 5 輸出 2 解釋 有兩種方式可以湊成總金額 5 55 1 1 1 1 1 示例2 輸入 n 10 輸出 4 解釋 有四種方式可以湊成總...