dp (1)
这个题目我开始是这么定义的dp[i][j][0] dp[i][j][1] 表示对于第i个节点还有j个的选择 0 代表不选这个节点,1 代表选这个节点。
然后我写了,对题目理解出现了偏差写出来一个错误的,然后正确理解题意发现这样子写好麻烦。转移方程很难写。
上网搜题解,网上基本上都是这么定义的 dp[i][j]表示选第 i 个节点该子树的节点数为 j 的最大带权值。
所以这个就可以变成一个树形dp+01背包。
这个状态转移方程应该就是 dp[u][j]=max(dp[u][j] ,dp[u][j-k]+dp[v][k]) 其实我觉得这个转移方程也没有那么好想。
这个01背包就是在枚举以u为根节点的这棵树的每一颗子树取多少个节点。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e5 + ;
int dp[][];
vector<int>G[];
int n, k; void dfs(int u,int pre)
{
for (int i = ; i < G[u].size(); i++)
{
int v = G[u][i];
if (v == pre) continue;
dfs(v, u);
for (int j = k; j >= ; j--)
{
for (int h = ; h < j; h++)
{
dp[u][j] = max(dp[u][j], dp[u][j - h] + dp[v][h]);
}
}
}
} int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(dp, , sizeof(dp));
for (int i = ; i <= n; i++) G[i].clear();
for (int i = ; i < n; i++) {
scanf("%d", &dp[i][]);
}
for(int i=;i<n;i++)
{
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(, -);
int ans = ;
for(int i=;i<n;i++)
{
ans = max(ans, dp[i][k]);
}
printf("%d\n", ans);
}
return ;
}
树形dp
这个题目其实我觉得很像就是在求回文,所以和那个兔子的题目很像,但是呢,还是有一点点的不同
回忆一下兔子的题目 兔子传送门
这个题目的状态转移方程也就是
if(条件判断) dp[i][j]=max(dp[i+1][dp[j-1]+2,dp[i][j])
else dp[i][j]=max(dp[i+1][j],dp[i][j-1])
这个题目还有一个地方,就是因为我们定义的dp[i][j]表示从i到j的最大的匹配了的数量,所以呢,()()()
这种情况,如果你值是进行状态转移,那就会出现问题了,
因为dp[1][2]=2 dp[2][3]=1 dp[3][4]=2 所以 dp[1][4]=dp[2][3]+2这个就不对了,这个时候,我们应该找一个切断点。
dp[1][4]的切断点就是dp[1][2]+dp[3][4]=4
所以说还有有一个for循环来找这个断点,这个我也没想明白是看题解的。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
int dp[][];
char s[]; int main()
{
while(scanf("%s",s+)!=EOF)
{
if (s[] == 'e') break;
memset(dp, , sizeof(dp));
int len = strlen(s + );
int ans = ;
for(int i=;i<=len;i++)
{
for(int j=;j+i-<=len;j++)
{
int ends = i + j - ;
if ((s[j]=='('&&s[ends]==')')||(s[j]=='['&&s[ends]==']')) dp[j][ends] =dp[j + ][ends - ] + ;
else dp[j][ends] = max(dp[j + ][ends], dp[j][ends - ]);
for (int k = j; k < ends; k++) dp[j][ends] = max(dp[j][ends], dp[j][k] + dp[k+][ends]);
//printf("j %c ends %c dp[%d][%d]=%d\n", s[j],s[ends],j, ends, dp[j][ends]);
}
}
printf("%d\n", dp[][len]);
}
return ;
}
区间dp
这个题目我感觉还比较简单啊,就是字符串处理要注意一下,可以看我的另外一篇博客用sscanf的方法来处理很方便。
https://www.cnblogs.com/EchoZQN/p/10830015.html
处理完之后就是一个简单的01背包,需要注意的是因为有小数,所以*100转化成整数来处理即可。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 3e6 + ;
int dp[maxn], n, m;
int a[];
double q; int main()
{
while(scanf("%lf%d",&q,&m)!=EOF)
{
if (m == ) break;
n = (int)(q * );
int tot = ;
for(int k=;k<=m;k++)
{
int num;
scanf("%d", &num);
char ch, cs[];
double mon;
int A = , B = , C = , flag = ;
for(int i=;i<=num;i++)
{
scanf("%s", cs);
sscanf(cs, "%c:%lf", &ch, &mon);
int mm = (int)(mon * );
if (ch == 'A') A += mm;
else if (ch == 'B') B += mm;
else if (ch == 'C') C += mm;
else flag = ;
if (A > || B > || C > || (A + B + C) > ) flag = ;
// printf("%d %d %d\n", A, B, C);
}
if (flag == ) a[++tot] = A + B + C;
}
memset(dp, -inf, sizeof(dp));
dp[] = ;
//for (int i = 1; i <= tot; i++) printf("%d\n", a[i]);
//printf("n=%d\n", n);
for(int i=;i<=tot;i++)
{
for(int j=n;j>=a[i];j--)
{
dp[j] = max(dp[j], dp[j - a[i]]);
}
}
//printf("%d\n", dp[n]);
int ans = ;
for(int i=n;i>=;i--)
{
if(dp[i]>=)
{
ans = i;
break;
}
}
printf("%.2lf\n", ans*1.0 / );
}
return ;
}
01背包
这个就是今天的dp训练了,接下来就是复习以前的算法。
dp (1)的更多相关文章
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...
- AEAI DP V3.7.0 发布,开源综合应用开发平台
1 升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...
- AEAI DP V3.6.0 升级说明,开源综合应用开发平台
AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
- [斜率优化DP]【学习笔记】【更新中】
参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- px、dp和sp,这些单位有什么区别?
DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...
- android px转换为dip/dp
/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
随机推荐
- 树状数组模板--Color the ball
Color the ball HDU - 1556 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电 ...
- springboot项目war包部署及出现的问题Failed to bind properties under 'mybatis.configuration.mapped-statements[0].
1.修改pom文件 修改打包方式 为war: 添加tomcat使用范围,provided的意思即在发布的时候有外部提供,内置的tomcat就不会打包进去 <groupId>com.scho ...
- 在Python中该如何实现Java的重写与重载
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...
- H - Knight Moves DFS
A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...
- Linux学习笔记(三)目录和文件都能操作的命令
目录和文件都能操作的命令 rm cp mv rm 英文原意:remove files or directories 功能:删除文件或目录 语法:rm 选项[-fir] 文件或目录 rm -f 强制删除 ...
- [linux] [nginx] 一键安装web环境全攻略phpstudy版,超详细!
找到运行中的服务器(实例). 打开这个主要是看它的IP,是公网ip,公网ip,公网ip,重要的事情说三遍. 接下来我们可以不用在阿里云上操作了,直接用客户端操作,这两个客户端就是Xshell 5和Xf ...
- 随笔之——浮动(float)的影响及其清除、、clear与overflow-hidden清除float的不同!!!
一.浮动(float)对内联元素的影响. 1.我们都知道,内联元素(例如:span/img/input...)在正常情况下不可以对其设置宽高的,它的大小之只和它内部内容的多少有关. 我们怎样才可以对其 ...
- LeetCode 面试题56 - I. 数组中数字出现的次数 | Python
面试题56 - I. 数组中数字出现的次数 题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). ...
- sqlilab11-14
less11 抓包 ' " 实验发现'构成闭合,存在注入点 less-12 a,b都有注入点,b比较好判断闭合 less13 less14
- xpath进阶用法
一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外xpath中还存在着非常之多的进阶用法,本文将对 ...