接着前两篇,还是5道一贴吧。

题目链接地址:http://acm.hdu.edu.cn/problemclass.php?id=516

ProID 1159  Common Subsequence

题目意思很简单,是个最基本的DP,任何一本算法书都会讲这个题目,最长公共子序列。

状态转移方程,dp[i][j]=dp[i-1][j-1]+1(when str[i]==str[j])  max(dp[i-1][j],dp[i][j-1])(when str[i]!=str[j])

就不解释了,直接上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s1[2000],s2[2000];
int dp[2000][2000];
int main()
{while(scanf("%s %s",&s1,&s2)!=EOF){int L1=strlen(s1);int L2=strlen(s2);memset(dp,0,sizeof(dp));for(int i=1;i<=L1;i++)for(int j=1;j<=L2;j++)if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);printf("%d\n",dp[L1][L2]);}return 0;
}

ProID 1160   FatMouse's Speed

题目大意是,让你证明一下肥的老鼠跑的慢(直接翻译),其实就是求一个最长上升子序列问题,要找的就是在重量从小到大的一个序列中,找一个最长的序列,其中这个序列中的元素速度是递减的。这也算是一个比较经典的问题了,就不再多说了,最早的那篇中对最长上升子序列有详细解释。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<vector>
using namespace std;struct Data
{int weight;int speed;int index;
};
Data data[1001];bool com(Data d1,Data d2)
{if(d1.weight==d2.weight)return d1.speed>d2.speed;return d1.weight<d2.weight;
}
int dp[1001];
int memory[1001];
int main()
{int num=1;while(scanf("%d %d",&data[num].weight,&data[num].speed)!=EOF){data[num].index=num++;}sort(data+1,data+num,com);//按重量递减排序memset(dp,0,sizeof(dp));memset(memory,0,sizeof(memory));dp[1]=1;int res=data[1].speed;//最长上升子序列for(int i=2;i<num;i++){int len=0;memory[i]=i;for(int j=1;j<i;j++)if(data[i].speed<data[j].speed){if(len<dp[j]){len=dp[j];memory[i]=j;}}dp[i]=len==0?1:len+1;}//由于需要对结果输出,所以需要记录int ind=1;int tmp=dp[1];for(int i=2;i<num;i++){if(dp[i]>tmp){tmp=dp[i];ind=i;}}printf("%d\n",tmp);vector<int>vec;while(memory[ind]!=ind){vec.push_back(data[ind].index);ind=memory[ind];}vec.push_back(data[ind].index);for(int i=vec.size()-1;i>=0;i--)printf("%d\n",vec[i]);return 0;
}

ProID  1165    Eddy's research II

看题目应该是有个同样的题目吧,不然为什么会有个II呢。题目意思很简单,就是求解一个递归式,其实算不上是一个DP问题,题目放到这里或许有点问题吧,那就强制性的用用DP呗,其实就是一个方程式化简问题。化简过程就不写出来了,在纸上画画就明显能看出来,

这段代码是摘录题目后边的Discuss中一个同学的,因为看起来比较像DP,参考下吧。

#include<stdio.h>
int dp[4][1000005];
int main ()
{int i,j;for(i=0;i<=1000005;i++)dp[1][i]=i+2;for(i=0;i<=1000005;i++)dp[2][i]=i*2+3;dp[3][0]=5;for(i=1;i<=24;i++)dp[3][i]=2*dp[3][i-1]+3;while(~scanf("%d%d",&i,&j)){printf("%d\n",dp[i][j]);}return 0;
}

ProID 1176  免费馅饼

题目意思是,你站在一条路上的中间位置,这条路有11个点组成的,在某一秒种会有馅饼掉落,你可以在一秒内移动到两边的某一个位置上, 在当前位置上可以接到包括当前位置以及两边位置的馅饼。简单来说比如我站在5点,那么可以在1s内接到4,5,6其中的某一个点落下的馅饼。因为每次只能向左右移动,其实就是一个数塔的变形。普通的数塔是向左下或右下走。

状态转移方程:

dp[i][j]=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])+data[i][j]

解释一下,dp[i][j]表示从第i秒到第Max秒在位置j上所收获的最多的馅饼,就是由第i+1秒到第Max秒所获得的最多的馅饼,注意了,一定是从下往上算,一开始我也弄错了,算了半天总是结果不对,普通数塔是从上往下算(当然从下往上算也可以),是因为要求的最终结果在最下边一层,而且需要多一次最终的遍历,以找到最大值,本题目需要从下往上算是因为需要的最后最终结果在最顶层。

【不过个人觉得应该从上往下算也可以,但是实际做的时候却总是得不到正确的结果,哪位大神知道怎么做的话可否给点提示】

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;#define N 100005
int dp[N][11];int main()
{int n;while(scanf("%d",&n),n){memset(dp,0,sizeof(dp));int x,t;int Max_t=0;for(int i=0;i<n;i++){scanf("%d %d",&x,&t);dp[t][x]++;Max_t=max(Max_t,t);}for(int i=Max_t;i>=0;i--){dp[i][0]+=max(dp[i+1][0],dp[i+1][1]);for(int j=1;j<=9;j++)dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]);dp[i][10]+=max(dp[i+1][9],dp[i+1][10]);}printf("%d\n",dp[0][5]);}return 0;
}

ProID 1176 I NEED A OFFER

题目大意是,某个人有n快钱,向m个学校申请offer,告诉申请每个学校的资金和概率,求出至少拿到一份offer的概率。说白了就是个01背包问题,m个物品,总的背包重量是n,每装一个物品,所占用的背包重量是资金,收获的价值是获得offer的概率。对应起来直接套公式就可以了。

注意了,是求得至少获得一个offer的概率,因此需要使用全概率公式,保存的时候保存都不能获得offer的概率。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;int a[10005];
double b[10005],dp[10005];
int main()
{int n,m;while(scanf("%d %d",&n,&m)!=EOF && (n||m)){for(int i=0;i<m;i++){scanf("%d %lf",&a[i],&b[i]);b[i]=1.0-b[i];}for(int i=0;i<=n;i++)dp[i]=1;for(int i=0;i<m;i++)for(int j=n;j>=a[i];j--)dp[j]=min(dp[j],dp[j-a[i]]*b[i]);printf("%.1f%%\n",(1-dp[n])*100);}return 0;
}

杭电60道DP问题总结(三)相关推荐

  1. 杭电60道DP问题总结(一)

    杭电60道DP问题总结: DP是一个很有艺术的思想.看似简单的背后却隐藏着深刻的含义. 题目连接地址:http://acm.hdu.edu.cn/problemclass.php?id=516& ...

  2. 杭电60道DP问题总结(二)

    接着上一篇文章. 上次一次写的有点长了,保存好半天不成功,这次短一点吧,5道题目. 题目链接地址:http://acm.hdu.edu.cn/problemclass.php?id=516 ProID ...

  3. 杭电46道DP牛人总结

    原文地址:杭电46道DP牛人总结作者:飞泉鸣玉 杭电46道DP牛人总结 HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] 收藏 Robberies http://acm.hdu. ...

  4. 杭电60题--part 1 HDU1003 Max Sum(DP 动态规划)

    最近想学DP,锻炼思维,记录一下自己踩到的坑,来写一波详细的结题报告,持续更新. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem ...

  5. 杭电多校第一场第三题 Backpack(异或dp+bitset)

    问题描述 爱丽丝有一个容量背包m她现在想用一些物品填充! 爱丽丝有n项目,每个项目都有一个卷v我和值w我. 是否可以从n个项目中选择多个项目,以使背包完全装满(即体积的总和等于背包容量)?如果是这样, ...

  6. 杭电2151 Worm dp

    Worm Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. 杭电考研经验贴———报考计算机专业,慎重!!!

    杭电计算机硕士好考吗? 从前我不信,现在我信了!!! 这是一个坑... 杭电属于双非院校,充其量就是个普通重点大学,考研相比于985/211是不是好考一些.作为一名二本院校的学生,考杭电实在是太理想了 ...

  8. 最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂

    文章目录 前言 一.名称定义 1.最大公约数 2.辗转相除法 3.更相减损法 二.ACM杭电入门题 1.解题思路 三.解题参考代码(C语言,C++) 0.最优算法(C++) 1.辗转相除求解(C语言) ...

  9. 【HDU100】杭电入门一百道 C++ 全 题 解

    " Ctrl AC!一起 AC!" 题目集合链接:HDU2000-2099http://acm.hdu.edu.cn/listproblem.php?vol=11 前言 1. 好像 ...

最新文章

  1. 嵌入式程序调用函数的内部过程和机制
  2. Python(三)对装饰器的理解
  3. POJ 1001 Exponentiation C++解题报告 JAVA解题报告
  4. 达观数据分析平台架构和Hive实践
  5. TSV_TNEW_PAGE_ALLOC_FAILED
  6. Oracle 获取字符的位置并截取字符串
  7. 振动数据 自相关计算时时延_工业设备智能运维如何做?---振动监测
  8. iframe跨域自适应高度
  9. 太厉害了!2021年互联网大厂Java笔经
  10. java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp
  11. 必背42个单词_高中英语必背100个常考单词,考试必考
  12. wxWidgets:入门
  13. ETF的战争从未停止【文献推荐·天风金工吴先兴团队】
  14. ClouderaManager介绍、CDH特点、ClouderaManager架构、ClouderaManager功能、Cloudera Management Service
  15. 注册表-在IE上永久显示我的名字www.baidu.com - 朱建强
  16. 200万年薪的博士,华为到底看重什么?
  17. QAP-based Simulation-Extractable SNARK with a Single Verification及代码实现
  18. 金额换算(数字换汉字)
  19. Pytorch的grad、backward()、zero_grad()
  20. 通过小宝的卡牌游戏,看开源SCUT服务器运行使用

热门文章

  1. Linux下的cut选取命令详解
  2. vue-core-video-player播放器组件
  3. 自定义view绘图篇--图片和文字的绘制
  4. json 文件加注释
  5. 包教包会,纯 CSS 实现步进环绕跑马灯效果
  6. 360驱动轻巧版|云端匹配驱动
  7. Nagios安装教程
  8. 【转】手机开发平台介绍
  9. react native运行报watchman的问题
  10. MySQL 全文检索的实现