您的位置:首页 > 运维架构

hdu1011 Starship Troopers(树形dp)

2015-03-31 23:25 302 查看
开始尝试写写博客

树形dp,111数组大小过不了runtime error好久以为是自己代码错了,赞


对一个点n,最多派出m个士兵,得到的最大可能保存在dp
[m]

计算方法是遍历所有子节点进行背包。

第一次做这种稍微复杂的题目做了一天,太鸡了得多练

顺便学到了无权图可以用vector保存邻接链表,挺好挺简洁。有权图应该也可以用pair

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <fstream>
#define NINF -999999999
#define ll long long
using namespace std;
struct point
{
int t;
int brain;
int edgelist;
}caves[1111];
struct edge
{
int to;
int next;
}edges[1111];
int TotalEdge;
void AddEdge(int u,int v)
{
edges[TotalEdge].to=v;
edges[TotalEdge].next=caves[u].edgelist;
caves[u].edgelist=TotalEdge++;
}
int n,m;
int dp[1111][1111];
bool visited[1111];

void solve2(int n)      //解出以某个节点为根的最多的possibility dp
[0]到dp
[m];
{
for (int i=caves
.t;i<=m;i++) //初始化
dp
[i]=caves
.brain;
for (int i=0;i<caves
.t;i++)
dp
[i]=0;
visited
=true;
for (int tmp=caves
.edgelist;tmp!=0;tmp=edges[tmp].next)//遍历所有的子树
{
int tar(edges[tmp].to);
if (visited[tar])
continue;
solve2(tar);
for (int i=m;i>=caves
.t;i--)
{
for (int j=1;j<=i-caves
.t;j++)
dp
[i]=max(dp
[i],dp
[i-j]+dp[tar][j]);
}
}
}

int main()
{
cin.sync_with_stdio(false);
while (cin>>n>>m,n!=-1)
{
TotalEdge=1;
for (int i=1;i<=n;i++)
{
cin>>caves[i].t>>caves[i].brain;
//caves[i].t=(caves[i].t%20 ? 1 : 0) + caves[i].t / 20 ;
caves[i].t=(caves[i].t+19)/20;//其他人代码看到的一种比较方便的计算类似情况的方法
caves[i].edgelist=0;
visited[i]=false;
}
for (int i=0;i<n-1;i++)
{
int tp1,tp2;
cin>>tp1>>tp2;
AddEdge(tp1,tp2);
AddEdge(tp2,tp1);
}
if (m==0)
{
cout<<0<<endl;
continue;
}
solve2(1);
cout<<dp[1][m]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm