uva1292 基礎樹形dp

2021-07-06 00:01:23 字數 1176 閱讀 6947

思路:題目的意思是,遊一棵樹或者是森林,然後要在某些節點上放置乙個警察來防衛,然後每個警察呢只能防衛到自己所在節點和相鄰的節點,求所有節點都在直接或間接被防衛的時候需要的最少警察數目。

意思顯然,然後就是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...