T1

题目:codevs4815江哥的dp题a

codevs4815

一个简单的DP,注意开long long(不然会全WA),以及初始条件(这题有负数,所以要把f设成极小值.还要保证转移正确).

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
const int maxN = 1000 + 7;
using namespace std; ll f[maxN][maxN][2],w[maxN]; int main() {
ll n,k;
memset(f,-63,sizeof(f));
scanf("%lld%lld",&n,&k);
for(int i = 1;i <= n;++ i)
scanf("%lld",&w[i]);
for(int i = 0;i <= n;++ i) f[i][0][0] = 0;
for(int i = 1;i <= n;++ i) {
for(int j = 1;j <= k;++ j) {
f[i][j][0] = max(f[i - 1][j][0],f[i - 1][j][1]);
f[i][j][1] = max(f[i - 1][j - 1][0] + w[i],f[i][j][1]);
}
} printf("%lld",max(f[n][k][0],f[n][k][1]));
}

T2

题目:codevs1695 windows 2013

codevs1695

简单的DP,和上一个题差不多.注意题目中的开头先用

#include <iostream>
#include <cstring>
#include <cstdio>
#define ll long long
const int maxN = 100 + 7;
using namespace std; ll f[maxN][2],a[maxN],b[maxN],c[maxN],n;//f[i][0]当前用勺 f[i][1]当前用筷 int main() {
memset(f,0x3f,sizeof(f));
scanf("%lld",&n);
for(int i = 1;i <= n;++ i)
scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);//勺子筷子i道菜a_i,b_i。交换c_i
f[1][1] = b[1];
f[1][0] = c[1] + a[1];
for(int i = 2;i <= n;++ i) {
f[i][0] = min(f[i - 1][1] + c[i] + a[i],f[i - 1][0] + a[i]);
f[i][1] = min(f[i - 1][0] + c[i] + b[i],f[i - 1][1] + b[i]);
}
printf("%lld",min(f[n][0],f[n][1]));
return 0;
}

luogu2066 机器分配

题目链接:luogu2066

设状态f[i][j]表示第i个公司分配j台的最佳答案.那么就由dp转移方程.

dp[i][j] =dp[i - 1][j - k] + w[i][k];

输出路径,用一个数组存下路径就OK了.这里要注意的是按字典序进行输出,.

#include <iostream>
#include <cstdio>
#include <queue>
#define ll long long
const int maxN = 20;
const int maxM = 20;
using namespace std; queue<ll>q;
ll n,m;
ll w[maxN][maxM],f[maxN][maxM],path[maxN][maxM][maxN]; int main() {
scanf("%lld%lld",&n,&m);
for(int i = 1;i <= n;++ i ){
for(int j = 1;j <= m;++ j) {
scanf("%lld",&w[i][j]);
}
}
for(int i = 1;i <= n;++ i ) {
for(int j = 0;j <=m ;++ j ) {
for(int k = 0;k <= j;++ k) {
if(f[i - 1][k] + w[i][j - k] > f[i][j]) {
f[i][j] = f[i - 1][k] + w[i][j - k];
for(int l = 1;l < i;l ++ )path[i][j][l] = path[i - 1][k][l];
path[i][j][i] = j - k;
}
}
}
}
printf("%d\n",f[n][m]);
for(int i=1;i<=n;i++) cout<<i<<" "<<path[n][m][i]<<endl;
return 0;
}

luogu 1564膜拜

luogu1564

先求出i - j人数差.设f[i]表示前i人最少的分配的数,然后就有dp方程

f[i] = min(f[i],f[j] + 1)(j满足一定的条件)

#include<cstdio>
#include<algorithm>
using namespace std; int n,m,a[2501],b[2501],f[2501]; int main()
{
int i;
scanf("%d%d",&n,&m);
for(i=1,x;i<=n;i++)
{
scanf("%d",&x);
if(x == 1)
a[i] = a[i - 1] + 1,b[i] = b[i - 1];
else
a[i] = a[i - 1],b[i] = b[i - 1] + 1;
}
for(i = 1;i <= n;i ++)
{
f[i] = i;
for(j = i;j >= 0;j --)
if(a[i] - a[j] == i - j || b[i] - b[j] == i - j || abs(b[i] - b[j] - a[i] + a[j]) <= m)
f[i] = min(f[i],f[j]+1);
}
printf("%d",f[n]);
return 0;
}

luogu1115最大字段和

luogu1115

f[i]表示第i个位置的最大字段和.然后得转移方程:f[i] = max(f[i - 1] + a[i],a[i])

用一个变量不断地记录maxn

#include <iostream>
#include <cstdio>
#include <cstring>
const int maxN = 200000 + 7;
using namespace std; int f[maxN],maxn = -0x7fffffff,a[maxN]; int main() {
int n;
scanf("%d",&n);
for(int i = 1;i <= n;++ i )
scanf("%d",&a[i]);
for(int i = 1;i <= n;++ i) {
f[i] = max(f[i - 1] + a[i],a[i]);
maxn = max(f[i],maxn);
}
printf("%d",maxn);
return 0;
}

poj2479 -- Maximum sum

poj2479

正反两边最大子段和,然后枚举断点即可.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxN = 50000 + 7; int f[maxN],a[maxN],dp[maxN],qwq[maxN],qaq[maxN]; int main() {
int T,n;
scanf("%d",&T);
while(T --) {
int Ans = -0x7fffffff;
scanf("%d",&n);
memset(f,0,sizeof(f));
memset(dp,0,sizeof(dp));
memset(qwq,0,sizeof(qwq));
memset(qaq,0,sizeof(qaq));
for(int i = 1;i <= n;++ i)
scanf("%d",&a[i]);
for(int i = 1;i <= n;++ i)
f[i] = max(f[i - 1] + a[i],a[i]),qwq[i] = max(f[i],qwq[i - 1]);
for(int j = n;j >= 1; -- j)
dp[j] = max(dp[j + 1] + a[j],a[j]),qaq[j] = max(dp[j],qaq [j - 1]);
for(int i = 1;i <= n;++ i) {
Ans = max(Ans,qwq[i] + qaq[i + 1]);
}
printf("%d\n",Ans);
}
}

DP入门练习的更多相关文章

  1. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  2. xbz分组题B 吉利数字 数位dp入门

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

  3. 【dp入门题】【跟着14练dp吧...囧】

    A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...

  4. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  5. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  6. hdu3555 Bomb 数位DP入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...

  7. 【专章】dp入门

    动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. ***实践是检验真理的唯一标准,看再多文章不如自己动手做几道!!!*** 先 ...

  8. HDU 2084 数塔(简单DP入门)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  10. 树形DP入门详解+题目推荐

    树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...

随机推荐

  1. 后Selenium时代,网页自动化测试用Cypress

    本文技术难度★★★,初学自动化测试的朋友慎点!否则会引起焦虑等不适症状,严重者会怀疑自己技术人生! 来自Cypress官网首页! Web开发飞速换代! table控制页面OUT了! 原生态手写网页OU ...

  2. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一)

    本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...

  3. kafka剖析(转)

    Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...

  4. 线程安全 原子性 可见性 顺序性 volatile

  5. JMETER通过java代码通过代码/ JMETER API实现示例进行负载测试

    本教程试图解释Jmeter的基本设计,功能和用法,Jmeter是用于在应用程序上执行负载测试的优秀工具.通过使用jmeter GUI,我们可以根据我们的要求为请求创建测试样本并执行具有多个用户负载的样 ...

  6. Tinghua Data Mining 3

    特征选择 男女身高 男女抽烟 先验分布 熵 衡量系统的不确定性 属性的价值 降低了不确定性 降低的幅度越高越好 主成分分析 旋转是的数据间的correlation消失掉 Q是正交阵 七长八短,长宽相关 ...

  7. SNMP消息传输机制

    1.引言 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的所有可被查询和修改的参数.RF ...

  8. python入门之集合set

    集合(无序不重复) 创建 s = {} s = set() 转换 s = set(li) 方法 s.add("chy") #添加元素 s.clear() #清除元素 a = s.d ...

  9. Jquery EasyUI 中ValidateBox验证框使用讲解(转)

    Validatebox(验证框)的设计目的是为了验证输入的表单字段是否有效.如果用户输入了无效的值,它将会更改输入框的背景颜色,并且显示警告图标和提示信息.该验证框可以结合form(表单)插件并防止表 ...

  10. 内存泄露--contentView缓存使用与ListView优化

    引起Android内存泄露有很多种原因,下面罗列了一些问题,以后会一一解决 1.构造Adapter时没有使用缓存convertView(衍生出ListView优化问题) 2.查询数据库游标没有关闭 3 ...