dp 入门
1.HDU 1003
求最长连续相加的和。
dp[i]=max(a[i],dp[i-1]+a[i]);
dp[i]表示以 i 结尾的最大值。
再开/个strat去标记从哪里开始。
- #include <iostream>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- int dp[];
- int strat[];
- int a[];
- int main()
- {
- int t;
- scanf("%d",&t);
- int k=;
- while(t--)
- {
- k++;
- int n;
- scanf("%d",&n);
- for(int i=;i<n;i++)
- {
- scanf("%d",&a[i]);
- }
- memset(dp,,sizeof dp);
- memset(strat,,sizeof dp);
- dp[]=a[];
- strat[]=;
- int max=a[];
- int pp=;
- for(int i=;i<n;i++)
- {
- if(a[i]>a[i]+dp[i-])
- {
- dp[i]=a[i];
- strat[i]=i;
- }
- else
- {
- dp[i]=dp[i-]+a[i];
- strat[i]=strat[i-];
- }
- if(max<dp[i])
- {
- max=dp[i];
- pp=i;
- }
- }
- printf("Case %d:\n",k);
- printf("%d %d %d\n",max,strat[pp]+,pp+);
- if(t) printf("\n");
- }
- return ;
- }
2.hdu 1087
求最长上升序列的和;
dp[i]=max(dp[j])+a[i]; a[j]<a[i];
- #include <iostream>
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- int dp[];
- int a[];
- int main()
- {
- int n;
- while(~scanf("%d",&n))
- {
- if(n==)
- break;
- for(int i=;i<n;i++)
- {
- scanf("%d",&a[i]);
- }
- memset(dp,,sizeof dp);
- dp[]=a[];
- for(int i=;i<n;i++)
- {
- int MAX=;
- for(int j=;j<i;j++)
- {
- if(a[i]>a[j])
- {
- MAX=max(MAX,dp[j]);
- }
- }
- dp[i]=MAX+a[i];
- }
- int t=;
- for(int i=;i<n;i++)
- {
- t=max(t,dp[i]);
- }
- cout<<t<<endl;
- }
- return ;
- }
3.HDU 1159 最长公共子序列
dp[i][j]=dp[i-1][j-1]+1 a[i]==b[j]
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
读入是0 开始。计数的时候 从1开始。
- #include <iostream>
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- int dp[][];
- char a[];
- char b[];
- int main()
- {
- while(cin>>a>>b)
- {
- int t1=strlen(a);
- int t2=strlen(b);
- memset(dp,,sizeof dp);
- for(int i=;i<=t1;i++)
- for(int j=;j<=t2;j++)
- {
- if(a[i-]==b[j-])
- dp[i][j]=dp[i-][j-]+;
- else
- dp[i][j]=max(dp[i-][j],dp[i][j-]);
- }
- cout<<dp[t1][t2]<<endl;
- }
- return ;
- }
4.hdu-1160
最长上升子序列加路径
DP[i]表示i结尾的最长数目;
自己加一个 0 0break 测试一下
- #include<iostream>
- #include<algorithm>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- struct node
- {
- int w;
- int v;
- int no;
- }mice[];
- bool cmp(node a,node b)
- {
- if(a.w==b.w)
- return a.v<b.v;//最开始这里没有排一直出来5。因为体重一样的速度也在排。但是速度从小到大就不会被记录
- return a.w<b.w;
- }
- int pre[];
- int dp[];
- int main()
- {
- int a,b;
- int k=;
- while(cin>>a>>b)
- {
- mice[k].w=a;
- mice[k].v=b;
- mice[k].no=k+;
- k++;
- }
- sort(mice,mice+k,cmp);
- memset(pre,-,sizeof pre);
- for(int i=;i<k;i++)
- {
- dp[i]=;
- }
- int mx=,p=-;
- for(int i = ; i < k; i++)
- {
- for(int j = ; j < i; j++)
- {
- if( mice[j].v > mice[i].v)
- {
- if(dp[j]+ > dp[i])
- {
- dp[i] = dp[j]+;
- pre[i] = j;
- }
- }
- }
- if(dp[i]>mx)
- {
- mx=dp[i];
- p=i;
- }
- }
- cout<<mx<<endl;
- int res[];
- int i=;
- while(p!=-)
- {
- res[i++]=mice[p].no;
- p=pre[p];
- }
- i--;
- for(;i>=;i--)
- cout<<res[i]<<endl;
- return ;
- }
5.hdu-1176
这题详细写了。
- dp[0][i]= dp[0][i]+max(dp[0][i+1],dp[1][i+1]);
- dp[j][i]=dp[j][i]+max(dp[j-1][i+1],max(dp[j][i+1],dp[j+1][i+1]));
dp[10][i]= dp[10][i]+max(dp[10][i+1],dp[9][i+1]);
- #include<iostream>
- #include<algorithm>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- int dp[][];//i表示时间,j表示位子
- int main()
- {
- int n;
- int t,p;
- while(~scanf("%d",&n)&&n)
- {
- int mx=;
- memset(dp,,sizeof dp);
- for(int i=;i<n;i++)
- {
- scanf("%d%d",&p,&t);
- dp[p][t]++;
- mx=max(mx,t);
- }
- for(int i=mx-;i>=;i--)
- {
- dp[][i]= dp[][i]+max(dp[][i+],dp[][i+]);
- for(int j=;j<;j++)
- {
- dp[j][i]=dp[j][i]+max(dp[j-][i+],max(dp[j][i+],dp[j+][i+]));
- }
- dp[][i]= dp[][i]+max(dp[][i+],dp[][i+]);
- }
- cout<<dp[][]<<endl;
- }
- return ;
- }
dp 入门的更多相关文章
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- xbz分组题B 吉利数字 数位dp入门
B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...
- 【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] = ...
- 数位dp入门 hdu2089 不要62
数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...
- POJ 2342 树形DP入门题
有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...
- hdu3555 Bomb 数位DP入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...
- 【专章】dp入门
动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. ***实践是检验真理的唯一标准,看再多文章不如自己动手做几道!!!*** 先 ...
- HDU 2084 数塔(简单DP入门)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 树形dp 入门
今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...
- 树形DP入门详解+题目推荐
树形DP.这是个什么东西?为什么叫这个名字?跟其他DP有什么区别? 相信很多初学者在刚刚接触一种新思想的时候都会有这种问题. 没错,树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上. 既 ...
随机推荐
- ZOJ 3987 Numbers(Java枚举)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3987 题意:给出一个数n,现在要将它分为m个数,这m个数相加起来必须等于n ...
- Python学习 day01打卡
1.Python : 是一门解释型 弱类型 高级开发编程语言. 2.第一个Python程序的编写: print ("hell,world") 3.变量:把程序运行过程中的值储存起来 ...
- 把一个List拆分为几个大小一样的List
static void Main(string[] args) { List<String> tarArr = new List<String>(); tarArr.Add(& ...
- jsp导入数据库数据写法(模板)
1.导入表格模板 <%@ page language="java" contentType="text/html; charset=utf-8" page ...
- Oracle(限定查询2)
3.2 对数据进行限定查询 在标准SQL之中定义了许多的运算符. 3.2.1.关系运算符 范例: 范例: 范例: 在使用关系运算符判断字符数据的时候注意大小写的编写问题.因为Oracle是区分大小写的 ...
- System.out.println 报错: 只能运行在方法体内哦, 类里面只包含属性和方法哦,注意!
类里面包含属性和方法 所以, System.out.println,只能放在方法体内运行,不能放在类里.方法外哦
- 学习笔记33—graphPad画图集
1.如何去掉如下图所示的基准线(baseline): 解决办法:鼠标左键双击基准线 --->出现下图对话框,勾选Hide baseline即可. 2.画柱状图时,如何将正常人和病人的信息画在 ...
- jquery将表单序列化json对象
$.fn.serializeObject = function () { var obj = {}; var count = 0; $.each(this.serializeArray(), func ...
- Linux修改hostname时/etc/hosts、/etc/sysconfig/network ,hostname,三者的区别和联系
[root@localhost /]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.l ...
- Unity --- MeshRenderer之网格合并
创建如图所示的对象结构,parent为空对象,然后将下面的代码挂载到parent对象上运行即可. using UnityEngine; using System.Collections; public ...