思路:題目的意思是,遊一棵樹或者是森林,然後要在某些節點上放置乙個警察來防衛,然後每個警察呢只能防衛到自己所在節點和相鄰的節點,求所有節點都在直接或間接被防衛的時候需要的最少警察數目。
意思顯然,然後就是dp了;對於當前節點的決策是選與不選,dp[i][j],表示第i個節點的是否直接放置警察;
初始化是dp[i][1]=1;
dp[u][1] += min(dp[v][1],dp[v][0]);
dp[u][0] += dp[v][1];
由於存在森林,所以要遍歷一遍。
/*****************************************
author :crazy_ac(jamesqi)
time :2015
file name :
*****************************************/
// #pragma comment(linker, "/stack:1024000000,1024000000")
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define mem(a,b) memset(a,b,sizeof a)
typedef long long ll;
typedef unsigned long long ull;
typedef pairii;
const int inf = 1 << 30;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
inline int readint()
return x;
}int n;
vectorg[1510];
int dp[1510][2];
bool vis[1510];
void dfs(int u,int fa){
vis[u]=true;
dp[u][1]=1;
dp[u][0]=0;
for (int i=0;i
樹形DP(放置街燈,uva 10859)
前面也做了一道很像的題,那道題只要求放置的數目最少,要求覆蓋的是點。在這題中,要求覆蓋的是邊,不但要求放著的數目最少,更要求覆蓋兩次的邊最多。因此貪心法不再適用,最少要多少個點可以貪心求出,但是同時要求覆蓋兩次的邊要最多卻不是貪心法能夠解決的,無論如何都是逃不過動態規劃的。所以一開始用貪心做,做到最...
UVA 11782 揹包式樹形dp
這題目的意思好難讀,直接無語,原來最佳切割,要保證所有的葉子都被切掉。直接揹包就行,d i j 代表編號為i的節點用最多為j個點對其所在子樹形成的最佳割。include include include include include include include include include u...
樹形DP(完美的服務,uva 1218)
inf不能弄太大,因為會不停地累加很多次,事實上加三次就爆了。inf一直習慣了用0x3f3f3f3f,這不好,特別是dp時狀態轉移需要累加的情況,應該弄得比可能的上界再大一點點就好了。或者你可以不停地判斷,讓值最高只能達到inf。include define maxn 10010 define in...