HDU 1024  Max Sum Plus Plus

// dp[i][j] = max(dp[i][j-1], dp[i-1][t]) + num[j]
// pre[j-1] 存放dp[i-1][t] 里的 (1<=t<=j-1)最大值。
//dp[j] = max(dp[j-1], pre[j-1]) + num[j]; #include <stdio.h>
#include <string.h>
#include <iostream>
#define inf 100000000
#define maxn 1000010
using namespace std; int pre[maxn];
int num[maxn];
int dp[maxn]; int main() {
//freopen("in.cpp", "r", stdin);
int m, n;
while(~scanf("%d%d", &m, &n)) {
for (int i=1; i<=n; ++i)
scanf("%d", &num[i]); pre[0] = 0;
dp[0] = 0;
memset(pre, 0, sizeof(pre)); int maxx = -inf;
for (int i=1; i<=m; ++i) {
maxx = -inf;
for (int j=i; j<=n; ++j) {
dp[j] = max(dp[j-1], pre[j-1]) + num[j];
//pre[j-1] = max(dp[j-1], pre[j-2]);
pre[j-1] = maxx;
maxx = max(maxx, dp[j]);
}
}
printf("%d\n", maxx);
}
return 0;
}

POJ 1322 Chocolate

二维:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std; double dp[10010][210]; bool judge(int n, int m, int k) {
if (m > n || m > k) return false;
if ((m+n)%2) return false;
return true;
} int main() {
int k, n, m;
// freopen("in.cpp", "r", stdin);
while (~scanf("%d", &k) && k) {
scanf("%d%d", &n, &m); if (judge(n, m, k) == false) {
printf("0.000\n");
continue;
} if (n>10000) {
if (n%2) n = 10003;
else n = 10004;
}
memset(dp, 0, sizeof(dp));
dp[0][0] = 1; for (int i=1; i<=n; ++i) {
for (int j=0; j<=i && j<=k; ++j) {
if ((i+j)%2) continue;
if(j>0) dp[i][j] += dp[i-1][j-1]*(1-(j-1)*1.0/k);
if(j<k) dp[i][j] += dp[i-1][j+1]*(1.0*(j+1)/k);
}
} printf("%.3f\n", dp[n][m]);
}
return 0;
}

一维:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std; double dp[1000010];
double pre[1000010]; bool judge(int n, int m, int k) {
if (m > n || m > k) return false;
if ((m+n)%2) return false;
return true;
} int main() {
int k, n, m;
//freopen("in.cpp", "r", stdin);
while (~scanf("%d", &k) && k) {
scanf("%d%d", &n, &m); if (judge(n, m, k) == false) {
printf("0.000\n");
continue;
} if (n>10000) {
if (n%2) n = 10003;
else n = 10004;
}
memset(dp, 0, sizeof(dp));
memset(pre, 0, sizeof(pre));
pre[0] = 1; for (int i=1; i<=n; ++i) {
//memset(dp, 0, sizeof(dp));
for (int j=0; j<=i && j<=k; ++j) {
dp[j] = 0;
if ((i+j)%2) continue;
if(j>0) dp[j] += pre[j-1]*(1-(j-1)*1.0/k);
if(j<k) dp[j] += pre[j+1]*(1.0*(j+1)/k);
}
for (int j=0; j<=i && j<=k; ++j) {
pre[j] = dp[j];
}
} printf("%.3f\n", pre[m]);
}
return 0;
}

经典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. read 读取文件内容

    文件名 test28.sh #!/bin bash # reading data from a file count= cat test | while read line do echo " ...

  2. poj3525Most Distant Point from the Sea(半平面交)

    链接 求凸多边形内一点距离边最远. 做法:二分+半平面交判定. 二分距离,每次让每条边向内推进d,用半平面交判定一下是否有核. 本想自己写一个向内推进..仔细一看发现自己的平面交模板上自带.. #in ...

  3. spring 好处与优点

    使用Spring有什么好处?(1)Spring能有效地组织你的中间层对象.(2)Spring能消除在许多工程中常见的对Singleton的过多使用.(3)Spring能消除各种各样自定义格式的属性文件 ...

  4. hdu 4414 Finding crosses

    题目链接:hdu 4414 其实是一道简单的字符型水题,不涉及任何算法,可比赛时却没能做出来,这几天的状态都差到家了... 题目大意是求有多少个满足条件的十字架,十字架的边不能有分叉路口,所以枚举每个 ...

  5. Javascript 弱类型:除法结果是小数

    由于javascript是弱类型,只有一种var类型,所以在运算时不会自动强制转换,所以计算的结果是多少就是多少,但java中的17/10的结果就是1(强类型与弱类型)比如:console.log(M ...

  6. SVN使用汇总

    SVN项目管理文件夹:Tag/Branch/Trunk Trunk:在我经历的开发中,新建Trunk意味着对旧Trunk的一个保留,同时在新的Trunk中可以进行新功能的开发及对已有功能进行完善: B ...

  7. JQuery基础汇总

    1. 对象获取与赋值::$("#obj").val("Hello World!"); 2. 对象的显示与隐藏:$("#obj").show( ...

  8. sql raiseerror

    raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql server 2005的帮助 ]   其语法如下: RAISERROR ( { msg_id | msg ...

  9. sql中out与output

    --SQLQuery Create By Faywool         create proc Proc_OutPutTest--创建 @numA int,--numA为存储过程的参数 @numB  ...

  10. graph-tool文档(一)- 快速开始使用Graph-tool - 1.创建和操纵图

    目录: 快速开始使用graph-tool 创建和操纵图 -- 遍历顶点和边 ----- 遍历所有顶点或边 ----- 遍历一个顶点的neighbourhood 名词解释: instante:实例 di ...