UVALive 4015 Caves
来源:互联网 发布:晨曦计价软件视频 编辑:程序博客网 时间:2024/04/30 01:54
题目大意:给你一棵树,每条边有一个长度len,从根节点放一个机器人,问你机器人走的路程不超过x能访问的最大点数?
思路:树形DP,设d[ i ][ j ][ k ] 表示以第i个节点为根节点的子树机器人访问j个节点走的最少的路程,k==0表示访问完后又回到i节点,k==1表示访问完后不回来,则状态转移方程为:d[ i ][ j ][ 0 ] = min(d[ v ][ k ][ 0 ] + d[ i ][ j - k ][ 0 ] + 2*len ),d[ i ][ j ][ 1 ] = min(d[ v ][ k ][ 0 ] + d[ i ][ j - k ][ 1 ] + 2*len,d[ v ][ k ][ 1 ] + d[ i ][ j - k ][ 0 ] + len ),v表示i的儿子,len表示i到v的树枝长度。
自己先开始想的时候总想把状态定义为d[ i ][ x ][ k ],表示走x长度的最多节点,定式思维了,一看数据范围,就感觉不会做了。。 要学会根据数据范围合理的设置状态量。。
另外,看了思路,自己敲完的时候,一直WA,检查了好久才发现,,枚举 i 的 j 的时候要倒着来,因为是0、1背包,一直这个地方不注意,看来状态转移时,0、1背包的思想还是不够深入啊。。。 = =
代码如下:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int INF = 0x0fffffff ;const int MAXN = 555 ;struct Edge{ int t,next,len;} edge[MAXN];int head[MAXN],tot;void add_edge(int s,int t,int len){ edge[tot].t= t; edge[tot].len = len; edge[tot].next = head[s]; head[s] = tot++;}int n;int d[MAXN][MAXN][2];int num[MAXN];void dfs(int u){ for(int i = 0;i<=n;i++) d[u][i][0] = d[u][i][1] = INF; d[u][1][0] = 0; d[u][1][1] = 0; num[u] = 1; for(int e = head[u]; e!=-1 ;e = edge[e].next) { int v = edge[e].t; int len = edge[e].len; dfs(v); num[u] += num[v]; for(int i = num[u];i>=1;i--) for(int j = 1;j<=min(i-1,num[v]);j++) { d[u][i][0] = min(d[u][i][0],d[v][j][0] + 2*len +d[u][i-j][0]); d[u][i][1] = min(d[u][i][1],min(d[v][j][0] + 2*len +d[u][i-j][1],d[v][j][1] + len +d[u][i-j][0])); } }}int is_root[MAXN];int main(){ int ca = 0; while(~scanf("%d",&n)&&n) { tot = 0; memset(head,-1,sizeof(head)); int a,b,c; for(int i = 0;i<n;i++) is_root[i] = 1; for(int i = 1;i<n;i++) { scanf("%d%d%d",&a,&b,&c); add_edge(b,a,c); is_root[a] = 0; } int root = 0; for(int i = 0;i<n;i++) if(is_root[i]) { root = i; break; } dfs(root); int q; scanf("%d",&q); int x; printf("Case %d:\n",++ca); for(int i = 1;i<=q;i++) { scanf("%d",&x); int ans = 0 ; for(int j = n;j>=1;j--) { if(d[root][j][0]<=x||d[root][j][1]<=x) { ans = j; break; } } printf("%d\n",ans); } } return 0;}
- UVALive 4015 Caves
- UVALive 4015 Caves
- UVALive - 4015 Caves
- uvalive 4015 caves
- UVALive 4015 Caves 树形背包
- UVALive - 4015 Caves 树形DP
- UVALive 4015 - Caves(树形DP)
- UVALive 4015 Caves--树形dp
- UVALive 4015 Caves(树型dp)
- UVALive 6345 The Glittering Caves of Aglarond (找规律求最多)
- uva 4015 - Caves Chengdu 2007 树形背包★
- code caves
- LA4015 Caves
- UVALive 4015 树形dp
- Ural1553.Caves and Tunnels
- uva1407 - Caves 树形DP
- HNU13247Connected Caves (拓扑)
- hdu3672 Caves 树形dp
- Data Preprocessing-Python
- poj2892
- 使用gdal对图像重采样再按指定格式输出
- iPhone中取得LAC和cellid等信息
- hdu 4655 Cut Pieces/杭电多校第六场1001 找规律,或者dp
- UVALive 4015 Caves
- 社区运营人员的技能等级
- 面试心得
- strchr函数
- NIO资料汇总
- USACO Barn Repair
- QQ互联sdk实现分享到QQ空间
- iOS -- 百度地图API
- java程序员在写XQL程序时候常犯的10个错误