D - Tree of Tree ZOJ - 3201

这个题目我开始是这么定义的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为根节点的这棵树的每一颗子树取多少个节点。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <queue>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <iostream>
  8. #define inf 0x3f3f3f3f
  9. using namespace std;
  10. const int maxn = 1e5 + ;
  11. int dp[][];
  12. vector<int>G[];
  13. int n, k;
  14.  
  15. void dfs(int u,int pre)
  16. {
  17. for (int i = ; i < G[u].size(); i++)
  18. {
  19. int v = G[u][i];
  20. if (v == pre) continue;
  21. dfs(v, u);
  22. for (int j = k; j >= ; j--)
  23. {
  24. for (int h = ; h < j; h++)
  25. {
  26. dp[u][j] = max(dp[u][j], dp[u][j - h] + dp[v][h]);
  27. }
  28. }
  29. }
  30. }
  31.  
  32. int main()
  33. {
  34. while(scanf("%d%d",&n,&k)!=EOF)
  35. {
  36. memset(dp, , sizeof(dp));
  37. for (int i = ; i <= n; i++) G[i].clear();
  38. for (int i = ; i < n; i++) {
  39. scanf("%d", &dp[i][]);
  40. }
  41. for(int i=;i<n;i++)
  42. {
  43. int u, v;
  44. scanf("%d%d", &u, &v);
  45. G[u].push_back(v);
  46. G[v].push_back(u);
  47. }
  48. dfs(, -);
  49. int ans = ;
  50. for(int i=;i<n;i++)
  51. {
  52. ans = max(ans, dp[i][k]);
  53. }
  54. printf("%d\n", ans);
  55. }
  56. return ;
  57. }

树形dp

C - Brackets POJ - 2955

这个题目其实我觉得很像就是在求回文,所以和那个兔子的题目很像,但是呢,还是有一点点的不同

回忆一下兔子的题目  兔子传送门

这个题目的状态转移方程也就是

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循环来找这个断点,这个我也没想明白是看题解的。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <queue>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <string>
  8. #include <iostream>
  9. #define inf 0x3f3f3f3f
  10. using namespace std;
  11. int dp[][];
  12. char s[];
  13.  
  14. int main()
  15. {
  16. while(scanf("%s",s+)!=EOF)
  17. {
  18. if (s[] == 'e') break;
  19. memset(dp, , sizeof(dp));
  20. int len = strlen(s + );
  21. int ans = ;
  22. for(int i=;i<=len;i++)
  23. {
  24. for(int j=;j+i-<=len;j++)
  25. {
  26. int ends = i + j - ;
  27. if ((s[j]=='('&&s[ends]==')')||(s[j]=='['&&s[ends]==']')) dp[j][ends] =dp[j + ][ends - ] + ;
  28. else dp[j][ends] = max(dp[j + ][ends], dp[j][ends - ]);
  29. for (int k = j; k < ends; k++) dp[j][ends] = max(dp[j][ends], dp[j][k] + dp[k+][ends]);
  30. //printf("j %c ends %c dp[%d][%d]=%d\n", s[j],s[ends],j, ends, dp[j][ends]);
  31. }
  32. }
  33. printf("%d\n", dp[][len]);
  34. }
  35. return ;
  36. }

区间dp

Q - 最大报销额HDU - 1864

这个题目我感觉还比较简单啊,就是字符串处理要注意一下,可以看我的另外一篇博客用sscanf的方法来处理很方便。

https://www.cnblogs.com/EchoZQN/p/10830015.html

处理完之后就是一个简单的01背包,需要注意的是因为有小数,所以*100转化成整数来处理即可。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <queue>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <string>
  8. #include <iostream>
  9. #define inf 0x3f3f3f3f
  10. using namespace std;
  11. const int maxn = 3e6 + ;
  12. int dp[maxn], n, m;
  13. int a[];
  14. double q;
  15.  
  16. int main()
  17. {
  18. while(scanf("%lf%d",&q,&m)!=EOF)
  19. {
  20. if (m == ) break;
  21. n = (int)(q * );
  22. int tot = ;
  23. for(int k=;k<=m;k++)
  24. {
  25. int num;
  26. scanf("%d", &num);
  27. char ch, cs[];
  28. double mon;
  29. int A = , B = , C = , flag = ;
  30. for(int i=;i<=num;i++)
  31. {
  32. scanf("%s", cs);
  33. sscanf(cs, "%c:%lf", &ch, &mon);
  34. int mm = (int)(mon * );
  35. if (ch == 'A') A += mm;
  36. else if (ch == 'B') B += mm;
  37. else if (ch == 'C') C += mm;
  38. else flag = ;
  39. if (A > || B > || C > || (A + B + C) > ) flag = ;
  40. // printf("%d %d %d\n", A, B, C);
  41. }
  42. if (flag == ) a[++tot] = A + B + C;
  43. }
  44. memset(dp, -inf, sizeof(dp));
  45. dp[] = ;
  46. //for (int i = 1; i <= tot; i++) printf("%d\n", a[i]);
  47. //printf("n=%d\n", n);
  48. for(int i=;i<=tot;i++)
  49. {
  50. for(int j=n;j>=a[i];j--)
  51. {
  52. dp[j] = max(dp[j], dp[j - a[i]]);
  53. }
  54. }
  55. //printf("%d\n", dp[n]);
  56. int ans = ;
  57. for(int i=n;i>=;i--)
  58. {
  59. if(dp[i]>=)
  60. {
  61. ans = i;
  62. break;
  63. }
  64. }
  65. printf("%.2lf\n", ans*1.0 / );
  66. }
  67. return ;
  68. }

01背包

这个就是今天的dp训练了,接下来就是复习以前的算法。

dp (1)的更多相关文章

  1. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

  2. 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 ...

  3. AEAI DP V3.7.0 发布,开源综合应用开发平台

    1  升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...

  4. AEAI DP V3.6.0 升级说明,开源综合应用开发平台

    AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...

  5. BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4026  Solved: 1473[Submit] ...

  6. [斜率优化DP]【学习笔记】【更新中】

    参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...

  7. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  8. px、dp和sp,这些单位有什么区别?

    DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...

  9. android px转换为dip/dp

    /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...

  10. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

随机推荐

  1. python 自动生成model 文件 案例分析

    生成方式 Python中想要自动生成 model文件可以通过 sqlacodegen这个命令来生成对应的model文件 sqlacodegen 你可以通过pip去安装: pip install sql ...

  2. 【漏洞通告】Linux Kernel 信息泄漏&权限提升漏洞(CVE-2020-8835)通告

    0x01漏洞简介: 3月31日, 选手Manfred Paul 在Pwn2Own比赛上用于演示Linux内核权限提升的漏洞被CVE收录,漏洞编号为CVE-2020-8835.此漏洞由于bpf验证系统在 ...

  3. python初学(一)

    1.输入一个百分制成绩,要求输出成绩等级A.B.C.D.E,其中90~100分为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E. 要求:1)用if语句实现:2)输入百分制成绩 ...

  4. webWMS开发过程记录(四)- 整体设计

    分层 View(Servlet/Action/JSP)--> Service(接口/实现类) --> Dao(接口/实现类) 所用技术 Struts2 Hibernate Spring J ...

  5. python操作数据库-SQLSERVER-pyodbc

    刚开始学python时,大家都习惯用pymssql去读写SQLSERVER.但是实际使用过程中,pymssql的读写性能以及可靠性的确不如pyodbc来的好. 正如微软官方推荐使用pyodbc库,作为 ...

  6. 2019 kali安装pip/pip3

    新版的kali中内置的python没有安装pip 0x01 pip(python2)安装: https://bootstrap.pypa.io/2.6/get-pip.py python2 get-p ...

  7. weblogic漏洞(一)----CVE-2017-10271

    WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271) 0x01 漏洞原因: Weblogic的WLS Security组件对外提供webservice服务,其中使用了XM ...

  8. Springboot:员工管理之删除员工及退出登录(十(9))

    springboot2.2.6 delete请求报错,降至2.1.11功能可用 原因未知 构建员工删除请求 com\springboot\controller\EmployeeController.j ...

  9. Java中的二分查找

    二分查找:(折半查找) 前提:数组必须是有序的. 思想:每次都猜中间的那个元素,比较大或者小,就能减少一半的元素.思路:A:定义最小索引,最大索引. B:比较出中间索引 C:拿中间索引的值和要查找的元 ...

  10. ORM之单表、多表操作

    参考1 参考2 表与表之间的关系: 一对一(OneToOneField):一对一字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面 一对多(ForeignKey):一对多字段建在 ...