【树形DP】wikioi 1163 访问艺术馆
来源:互联网 发布:ftp控制协议端口 编辑:程序博客网 时间:2024/04/30 15:12
题目来源:http://wikioi.com/problem/1163/
分析:
树状动态规划。
用树存储艺术馆内的情况,然后从根到叶递归求解。对于每个节点,将可用时间分给他的左右儿子,枚举所有分法,取最大值。最后输出根节点的数值即可。
代码:
#include<cstdio>#include<iostream>#include<cstring>#define maxn 301#define maxt 601using namespace std;struct node{int t,ls,rs,v;}te[maxn]; //储存树的信息 int a[maxn][2],f[maxn][maxt],m=0,i,ti;void build(int r) //递归建树 { te[r].t=2*a[r][0];te[r].v=a[r][1];if (a[r][1]!=0){te[r].ls=te[r].rs=-1;return;}te[r].ls=++m;build(m);te[r].rs=++m;build(m);}int dfs(int r,int i){if (f[r][i]!=-1) return f[r][i]; //如果已有值,直接返回 if (i==0) return f[r][i]=0; //时间没了,返回 if (te[r].ls==-1) { if (te[r].v*5<i-te[r].t) return te[r].v; //能拿完 else return (i-te[r].t)/5; //不能拿完 } int lt,rt; for (lt=0;lt<=i-te[r].t;lt++) //枚举不同分法 { rt=i-te[r].t-lt; int s1=dfs(te[r].ls,lt); int s2=dfs(te[r].rs,rt); f[r][i]=max(f[r][i],s1+s2); } return f[r][i];}int main(){memset(f,-1,sizeof(f));scanf("%d",&ti);while (scanf("%d%d",&a[i][0],&a[i][1])!=EOF) i++;build(m);printf("%d",dfs(0,ti));return 0;}
- 【树形DP】wikioi 1163 访问艺术馆
- wikioi 1163 访问艺术馆 树形dp
- 【树形dp】【记忆化】访问艺术馆 WikiOI 1163
- 【树形dp】访问艺术馆
- CodeVS 1163 访问艺术馆(树形DP)
- wikioi-天梯-进入省队-树状dp-1163:访问艺术馆
- 树形DP(访问艺术馆)
- codevs1163 访问艺术馆(树形dp)
- 访问艺术馆 codevs1163 树形dp
- wikioi p1163 访问艺术馆
- 一、树形dp(1)访问艺术馆
- 树形dp 访问艺术馆(又称访问美术馆)
- 1163 访问艺术馆
- 1163 访问艺术馆
- CODEVS 1163 访问艺术馆
- CODEVS 1163 访问艺术馆
- 【Codevs1163】访问艺术馆 树形dp 记忆化搜索(8/1000)
- codevs1163 访问艺术馆(树型dp)
- 你尽力了吗
- Ubuntu 13.04 安装使用clang
- 命令行开启WIFI
- 泰克模拟示波器2465B维修
- C++构造函数详解及显式调用构造函数
- 【树形DP】wikioi 1163 访问艺术馆
- note : IRP hook on R0
- Android Service被系统回收的解决方法
- PropertyUtils.getProperty和PropertyUtils.setProperty的用法详解
- 编写断点续传和多线程下载模块
- 关于 javascript event flow 的一个bug
- 用Winsock实现语音全双工通信
- eclipse设置编辑xml文件的智能提示
- Transition Effects