一道樹形dp卡了這麼久。。。
題意:乙個書中,每個點都可以安伺服器,問最少多少伺服器可以使每個不是伺服器的點恰好只與乙個伺服器相鄰
把每個點分情況討論
1.自己安伺服器 2.自己不安,父節點安,這樣所有子節點不能安 3自己不安,父節點不安,這樣有且只有乙個子節點安
設dp[i][0]為i及其子樹,當i安伺服器時最少伺服器。dp[i][2]表示i的父親安兒子不安,dp[i][1]表示i的乙個兒子安父親不安
dp[i][0]可以從兒子中0,1轉移,dp[i][2]只能從兒子中1轉移
只有乙個兒子安這種情況看起來麻煩一點,但是可以看成本來所有兒子都不安,這樣就等於dp[i][2],然後選出乙個兒子變成安,這樣會產生乙個差值,最後加上所有兒子中最小的差值
然後怒交一發,發現wa??然後xjb改都沒有用,然後盯著**看了半天腦洞一開發現自己inf按照習慣開的兩千萬,這樣葉節點兒子安的情況是inf,但是如果有乙個節點連了很多葉節點,轉移的時候很有可能會爆int。碼力弱。。。
#include#include#include#define maxn (20010)
#define inf (210010)
using namespace std;
int n,m1,h[maxn],dp[maxn][3];
struct edge
}q[maxn];
void addedge(int x,int y)
void dfs(int x,int fa)
dp[x][1]=dp[x][2]+k;
}int main()
scanf("%d",&x);
dfs(1,0);
printf("%d\n",min(dp[1][0],dp[1][1]));
if (x==-1) break;
}}
樹形DP(完美的服務,uva 1218)
inf不能弄太大,因為會不停地累加很多次,事實上加三次就爆了。inf一直習慣了用0x3f3f3f3f,這不好,特別是dp時狀態轉移需要累加的情況,應該弄得比可能的上界再大一點點就好了。或者你可以不停地判斷,讓值最高只能達到inf。include define maxn 10010 define in...
UVA 1218 完美的服務
樹上的動態規劃,仍然按照每個節點的情況分類 1.f u 0 表示u是伺服器,那麼每個子節點可以是也可以不是 2.f u 1 表示u不是伺服器,而u的父親是伺服器,則u的所有子節點都不是伺服器 3.f u 2 表示u和父親都不是伺服器,則u恰好有乙個兒子是伺服器 那麼可以得到以下轉移方程 v代表u的所...
Uva 1218 完美的服務
題意 乙個網路,選出一些點做伺服器,使滿足一些條件,求伺服器最少數量。條件是,每個計算機恰有一台伺服器相連。分析 對於每個節點,都有3種狀態,1 他是伺服器 d u,0 2 他不是伺服器,但是父親是的 d u,1 如果他父親是伺服器,將影響他的接下來的決策。3 他不是伺服器,父親也不是伺服器 d u...