【考题题解8】两次动归较简单题题解

原创 2018年04月17日 18:20:23

1.跑步HLOJ#1161


详细见代码:

#include<bits/stdc++.h>
using namespace std;
int f[20000][600]={};
int main()
{
	int n,m,a[10000]={};
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	    cin>>a[i];
	for (int i=1;i<=n;i++)
	{
		f[i][0]=f[i-1][0];
		for (int j=1;j<=m;j++)
		{
		    f[i][j]=max(f[i][j],f[i-1][j-1]+a[i]);
		    if (i-j>=0) f[i][0]=max(f[i-j][j],f[i][0]);
		}
	}
	cout<<f[n][0];
}

2.渡河问题#HLOJ1162

可以根据公交乘车的思路进行理解

我们设f[i]为前i头牛渡河的最大值,当我们进行状态转移的时候就可以这样:

枚举j(1~i-1),表示不和第i头牛一起过河的数量总和,然后:

1.f[i]的初值,t[i](时间前缀和),表示第i头牛单独过河

2.进行状态转移是的状态转移方程是f[i]=max(f[j]+t[i-j]+m),表示的意思是j头牛单独过河的最小值加上剩下牛过河的最小中加上送药河岸的时间

3.值得注意的是,每次必须要加上返回的时间。

#include<bits/stdc++.h>
using namespace std;
int f[20000][600]={};
int main()
{
	int n,m,a[10000]={},f[10000]={},t[10000]={};
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	    cin>>a[i];
	for (int i=1;i<=n;i++)
	    t[i]=t[i-1]+a[i];
	f[1]=a[1]+m;
	for (int i=2;i<=n;i++)
	{
		f[i]=t[i];
		for (int j=1;j<=i-1;j++)
		    f[i]=min(f[i],f[j]+t[i-j]+m);
		f[i]+=m;
	}
	cout<<f[n];
	return 0;
}

3.马拉松HLOJ1164

我们设f[i][j]表示能够走到第i个点跳过j个点所能走到的最小体力

我们可以枚举i和j(这个已经简单到不用再解释为什么了吧)

然后枚举l,表示连续的跳l个到i点的数目

然后:

f[i][j]=min(f[i][j],f[i-l-1][j-l]+dis(i-l-1,i));

表示从i-l-1跳到第i格的距离加上从起点跳到第i-l-1格的距离和

然后就可以出程序了:


#include<bits/stdc++.h>
using namespace std;
struct p {int x,y;}a[10000]={};
int dis(int l,int r){return abs(a[l].x-a[r].x)+abs(a[l].y-a[r].y);}
int main()
{
	int n,k,f[600][600];
	cin>>n>>k;
	for (int i=1;i<=n;i++)
	   cin>>a[i].x>>a[i].y;
	memset(f,99,sizeof(f));
	for (int i=1;i<=n;i++)
	    f[i][i]=1;
	f[1][0]=0;
	for (int i=2;i<=n;i++)
	    for (int j=0;j<=min(i-2,k);j++)//跳跃的次数 
	        for (int l=0;l<=j;l++)//连续跳跃的点
			    f[i][j]=min(f[i][j],f[i-l-1][j-l]+dis(i-l-1,i));
	cout<<f[n][k];
	return 0;
}

4.养我(猪)HLOJ#1165

我道题有一个可怕而无法解决的无后效性

然后可以用pi进行排序:即下降的慢的后面杀,这样的话DP过程中就可以保证当前状态是最优的

接下来,我们设f[i][j]为前i头猪杀j头猪的最优值,在这里,我们不展开详细讨论。

接下来推荐一下hzk大佬的一段话:

大概是这样的一道题:

有人要卖猪,开始一天第i头猪的价值为ai,但每天第i头猪的价值会减少pi,若这头猪已经价值为负数了,那么这头猪的价值会变为0.

那么每天只能卖一头猪,问你k天后的最大价值.

那么这是一道DP题.

怎么DP,这明显有后效性.

那我们对它进行一个排序.

这个排序的准则是什么?

我们可以把这几头猪按照pi从大到小排序.

那么后面的猪一定是在前面的猪后面杀的.

证明的话可以用反证法:

假设猪i在猪j后面杀(i<j,已经排序过了),那么pi一定小于pj,肯定不会比猪i在前面杀划算.

若会到0,你就不用管了.

那么我们的排序准则就是以pi为第一关键字,ai为第二关键字排序.

所以我们的后效性问题解决了,我们就可以开始DP了.

我们设dp[i][j]表示前i头猪杀了j头的最大利润.

那么很明显我们可以列出方程:f[i][j]=max(f[i-1][j],f[i-1][j-1]+add).

其中add=max(0,a[i]-p[i]*(j-1)).

参见代码:

#include<bits/stdc++.h>
using namespace std;
struct Pig{int begin,pi;}a[10000]={};
inline bool pigcmp(Pig x,Pig y){return x.pi>y.pi;}
int f[1000][1000]={};
int main()
{
	int n,p,maxx=-1;
	cin>>n>>p;
	for (int i=1;i<=n;i++)
	    cin>>a[i].begin;
	for (int i=1;i<=n;i++)
	    cin>>a[i].pi;
	sort(a+1,a+n+1,pigcmp); 
	for (int i=1;i<=n;i++)
	    for (int j=1;j<=i&&j<=p;j++)
	    {
	        f[i][j]=max(f[i-1][j]/*不取*/,max(0/*<=*/,f[i-1][j-1]+a[i].begin-a[i].pi*(j-1)/*取*/));
	        maxx=max(maxx,f[i][j]);
        }
    cout<<maxx;
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ronaldo7_ZYB/article/details/79978208

【原创】【动态规划】Vijos P1006 晴天小猪历险记之Hill

晴天小猪冒险记之Hill题目背景在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳、勇敢、善良、团结…… 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这...
  • c20182030
  • c20182030
  • 2017-07-24 08:14:08
  • 328

Leetcode 经典题目题解

所列均为个人解答 所用语言Java 尽量都用最优解解答 原题出自Leetcode:https://leetcode.com/problemset/algorithms/ 仅供参考...
  • jwyyuana
  • jwyyuana
  • 2015-12-16 05:46:02
  • 3270

搜索与回溯 字符序列

题目大意给出n,求出有多少长度为n由‘A’‘B’‘c’组成的字符序列。 要求:相邻子序列不能重合。 例子: ABCAB是合法的,AB没有重合。 ABABC和BABAC不是合法的。const ...
  • SSL_QYH0Ice
  • SSL_QYH0Ice
  • 2016-12-03 11:44:12
  • 181

我有10个职场经验,价值100万,但今天免费|咪蒙

(猪坚强 作品)“一个好员工能顶5个普通员工。” 一个当老板的朋友哭了。在创业群里,我们另外几个老板(虽然我的公司很小,但我也是老板啊)一起嘲笑他,说,是你老婆给你戴绿帽子了,还是被甲方睡了?他气死...
  • ajian005
  • ajian005
  • 2016-05-31 12:20:59
  • 1260

poj1149迈克卖猪问题(PIGS)

/** 建图: : 将顾客看作是除源点和汇点的结点,并且另设两个结点,源点和汇点 :源点和每个猪圈的第一位顾客连边,边的权值是开始时猪圈中猪的数量 :若源点和某个结点有重边,则将权值合并(因此,从原点...
  • Hearthougan
  • Hearthougan
  • 2014-02-23 15:52:49
  • 715

2016 acm/icpc 沈阳现场赛题解(5道题,更新ing)

5948.Thickest Burger(签到题)http://acm.hdu.edu.cn/showproblem.php?pid=5948题目大意:给你A和B,问2A+B和2B+A谁大?题目分析:...
  • cmershen
  • cmershen
  • 2016-11-21 21:59:04
  • 2379

楼教主男人必解八题之 Coins 解题报告

楼教主男人必解八题之 Coins 解题报告 题目详见http://acm.hdu.edu.cn/showproblem.php?pid=2844 这个题目和POJ1742是一个题目,也是楼教主的男人...
  • sustliangbo
  • sustliangbo
  • 2013-08-04 22:20:52
  • 3936

【敏捷开发每日一贴】:猪和鸡的故事

猪和鸡的故事 关于鸡与猪的故事有很多种版本,被用在各种不同的场合,管理的、营销的、敏捷开发的,大体相同,但稍有差异。 故事一:有一只鸡和一头猪合伙开饭店,双方各占50%股份。鸡对猪说:“我每天下...
  • huver2007
  • huver2007
  • 2017-04-07 09:06:17
  • 764

笔试_公司(1)

第一部分:综合素质测评 一、选择题:(请将答案填写在后面的括号内,每题5分,合计40分) 1、请仔细观察下面的数字,接在下组数字排列的后面,写出一个适宜的数字填写在括号内。() 2、3、5、...
  • thumbs_up_sign_ygj
  • thumbs_up_sign_ygj
  • 2017-10-15 12:57:45
  • 263

是男人就过 8 题--Pony.AI 题(A String Game-SAM建图+sg)

给一个字符串t和t的n个子串,2人轮流操作, 每次选一个子串,在后面添加一个字符,放回去,要求添加后字符串仍是t的子串。 无法操作者输,问谁赢。SAM建图+sg#include #include ...
  • nike0good
  • nike0good
  • 2018-03-28 22:53:30
  • 131
收藏助手
不良信息举报
您举报文章:【考题题解8】两次动归较简单题题解
举报原因:
原因补充:

(最多只允许输入30个字)