HDU 1024  Max Sum Plus Plus

  1. // dp[i][j] = max(dp[i][j-1], dp[i-1][t]) + num[j]
  2. // pre[j-1] 存放dp[i-1][t] 里的 (1<=t<=j-1)最大值。
  3. //dp[j] = max(dp[j-1], pre[j-1]) + num[j];
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <iostream>
  8. #define inf 100000000
  9. #define maxn 1000010
  10. using namespace std;
  11.  
  12. int pre[maxn];
  13. int num[maxn];
  14. int dp[maxn];
  15.  
  16. int main() {
  17. //freopen("in.cpp", "r", stdin);
  18. int m, n;
  19. while(~scanf("%d%d", &m, &n)) {
  20. for (int i=1; i<=n; ++i)
  21. scanf("%d", &num[i]);
  22.  
  23. pre[0] = 0;
  24. dp[0] = 0;
  25. memset(pre, 0, sizeof(pre));
  26.  
  27. int maxx = -inf;
  28. for (int i=1; i<=m; ++i) {
  29. maxx = -inf;
  30. for (int j=i; j<=n; ++j) {
  31. dp[j] = max(dp[j-1], pre[j-1]) + num[j];
  32. //pre[j-1] = max(dp[j-1], pre[j-2]);
  33. pre[j-1] = maxx;
  34. maxx = max(maxx, dp[j]);
  35. }
  36. }
  37. printf("%d\n", maxx);
  38. }
  39. return 0;
  40. }

POJ 1322 Chocolate

二维:

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. double dp[10010][210];
  7.  
  8. bool judge(int n, int m, int k) {
  9. if (m > n || m > k) return false;
  10. if ((m+n)%2) return false;
  11. return true;
  12. }
  13.  
  14. int main() {
  15. int k, n, m;
  16. // freopen("in.cpp", "r", stdin);
  17. while (~scanf("%d", &k) && k) {
  18. scanf("%d%d", &n, &m);
  19.  
  20. if (judge(n, m, k) == false) {
  21. printf("0.000\n");
  22. continue;
  23. }
  24.  
  25. if (n>10000) {
  26. if (n%2) n = 10003;
  27. else n = 10004;
  28. }
  29. memset(dp, 0, sizeof(dp));
  30. dp[0][0] = 1;
  31.  
  32. for (int i=1; i<=n; ++i) {
  33. for (int j=0; j<=i && j<=k; ++j) {
  34. if ((i+j)%2) continue;
  35. if(j>0) dp[i][j] += dp[i-1][j-1]*(1-(j-1)*1.0/k);
  36. if(j<k) dp[i][j] += dp[i-1][j+1]*(1.0*(j+1)/k);
  37. }
  38. }
  39.  
  40. printf("%.3f\n", dp[n][m]);
  41. }
  42. return 0;
  43. }

一维:

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. double dp[1000010];
  7. double pre[1000010];
  8.  
  9. bool judge(int n, int m, int k) {
  10. if (m > n || m > k) return false;
  11. if ((m+n)%2) return false;
  12. return true;
  13. }
  14.  
  15. int main() {
  16. int k, n, m;
  17. //freopen("in.cpp", "r", stdin);
  18. while (~scanf("%d", &k) && k) {
  19. scanf("%d%d", &n, &m);
  20.  
  21. if (judge(n, m, k) == false) {
  22. printf("0.000\n");
  23. continue;
  24. }
  25.  
  26. if (n>10000) {
  27. if (n%2) n = 10003;
  28. else n = 10004;
  29. }
  30. memset(dp, 0, sizeof(dp));
  31. memset(pre, 0, sizeof(pre));
  32. pre[0] = 1;
  33.  
  34. for (int i=1; i<=n; ++i) {
  35. //memset(dp, 0, sizeof(dp));
  36. for (int j=0; j<=i && j<=k; ++j) {
  37. dp[j] = 0;
  38. if ((i+j)%2) continue;
  39. if(j>0) dp[j] += pre[j-1]*(1-(j-1)*1.0/k);
  40. if(j<k) dp[j] += pre[j+1]*(1.0*(j+1)/k);
  41. }
  42. for (int j=0; j<=i && j<=k; ++j) {
  43. pre[j] = dp[j];
  44. }
  45. }
  46.  
  47. printf("%.3f\n", pre[m]);
  48. }
  49. return 0;
  50. }

经典DP 二维换一维的更多相关文章

  1. Max Sum Plus Plus HDU - 1024 基础dp 二维变一维的过程,有点难想

    /* dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (0<k<j) dp[i][j-1]+a[j]表示的是前j-1分成i组,第j个必 ...

  2. php 二维转一维

    Array(    [0] => Array        (            [salesorderid] => 10001            [createdtime] =& ...

  3. Win10 UWP开发:摄像头扫描二维码/一维码功能

    这个示例演示整合了Aran和微软的示例,无需修改即可运行. 支持识别,二维码/一维码,需要在包清单管理器勾选摄像头权限. 首先右键项目引用,打开Nuget包管理器搜索安装:ZXing.Net.Mobi ...

  4. 三维码 & 二维码 & 一维码

    三维码 & 二维码 & 一维码 3D, 2D, 1D 防伪国家标准 -<结构三维码防伪技术条件> http://www.xinhuanet.com/tech/2019-12 ...

  5. AcWing 156. 矩阵 (哈希二维转一维查询)打卡

    给定一个M行N列的01矩阵(只包含数字0或1的矩阵),再执行Q次询问,每次询问给出一个A行B列的01矩阵,求该矩阵是否在原矩阵中出现过. 输入格式 第一行四个整数M,N,A,B. 接下来一个M行N列的 ...

  6. 洛谷P1719 最大加权矩形 (DP/二维前缀和)

    题目描述也没啥好说的,就是给你个你n*n的矩形(带权),求其中最大权值的子矩阵. 首先比较好想的就是二维前缀和,n<=120,所以可以用暴力. 1 #include<bits/stdc++ ...

  7. HDU 2159 FATE (DP 二维费用背包)

    题目链接 题意 : 中文题不详述. 思路 : 二维背包,dp[i][h]表示当前忍耐值为i的情况下,杀了h个怪得到的最大经验值,状态转移方程: dp[i][h] = max(dp[i][h],dp[i ...

  8. hdu 1081 To The Max(dp+化二维为一维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081 To The Max Time Limit: 2000/1000 MS (Java/Others ...

  9. hdu6078 Wavel Sequence dp+二维树状数组

    //#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...

随机推荐

  1. tiled工具使用

    转的 在这个分为上下两部分的教程中,我们将介绍如何使用Cocos2D-X和地图编辑器做一款基于地图块的游戏.在这个简单的地图块游戏里,一个精灵将在沙漠里搜寻它可口的西瓜! 在教程的第一部分,我们将介绍 ...

  2. html一般标签、常用标签、表格

    body的属性: bgcolor               页面背景色 text                    文字颜色 topmargin            上边距 leftmargi ...

  3. 学习笔记day5:inline inline-block block区别

    1. block元素可以包含block元素和inline元素:但inline元素只能包含inline元素.要注意的是这个是个大概的说法,每个特定的元素能包含的元素也是特定的,所以具体到个别元素上,这条 ...

  4. Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace

    Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace   --去掉所有特殊字符,只剩字母  SELECT REGEXP ...

  5. golang文件上传和下载

    [代码]golang 实现的文件服务(包括上传,下载的server端和client端) (2013-09-20 02:03:52) 转载▼ 标签: golang go 文件服务器 it 分类: GO相 ...

  6. Linux 系统时间查看 及 时区修改(自动同步时间)

    1:使用date命令查看时区 [root@db-server ~]# date -R   Sun, 11 Jan 2015 07:10:28 -0800   [root@db-server ~]#   ...

  7. Webservice接口和Http接口

    WebService又是一种高级应用,与之前学习的Struts.Spring.Hibernate等框架不同.WebService是面向服务的架构(SOA),看起来像是比SSH框架要大.那么它到底是做什 ...

  8. Excel 、数据库 一言不合就转换 (zhuan)

    http://blog.csdn.net/marksinoberg/article/details/52280786 ***************************************** ...

  9. Sqlserver_left join 、right join、 inner join 用法

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  10. 激活MyEclipse 6.5方法-通过一段Java程序生成激活码

    在MyEclipse中新建一个Java类,名为MyEclipseKeyGen,将下面的Java代码拷贝到MyEclipseKeyGen类中,先修改变量subscriber的值,然后运行程序即可获得Su ...