caioj 1079 动态规划入门(非常规DP3:钓鱼)(动规中的坑)「建议收藏」

caioj 1079 动态规划入门(非常规DP3:钓鱼)(动规中的坑)「建议收藏」caioj 1079 动态规划入门(非常规DP3:钓鱼)(动规中的坑)

大家好,又见面了,我是你们的朋友全栈君。

这道题写了我好久, 交上去90分,就是死活AC不了

后来发现我写的程序有根本性的错误,90分只是数据弱

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

const int MAXN = 2123;
int dp[MAXN][MAXN], t[MAXN]; 
int f[MAXN], d[MAXN], h, n;

int main()
{
	scanf("%d%d", &n, &h);
	h *= 12;
	REP(i, 1, n + 1) scanf("%d", &f[i]);
	REP(i, 1, n + 1) scanf("%d", &d[i]);
	REP(i, 1, n) scanf("%d", &t[i]);
	
	REP(i, 0, h + 1) dp[0][i] = 0;
	REP(i, 0, n + 1) dp[i][0] = 0;
	REP(i, 1, n + 1)
	{
		int fish = f[i];
		REP(j, 1, h + 1)
		{
			if(j-t[i-1] > 0 && dp[i-1][j-t[i-1]] > dp[i][j-1] + fish)
				dp[i][j] = dp[i-1][j-t[i-1]], fish = f[i];
			else
				dp[i][j] = dp[i][j-1] + fish, fish = max(fish - d[i], 0);	
		}
	}
	printf("%d\n", dp[n][h]);
	
	return 0;
}

我一开始的程序是这样的,但是又非常多的问题

(1)我这个程序是以最后一个池塘为i定义的,所以应该是max(dp[i][h]),答案不一定是dp[n][h]

(2)dp[i][0] = 0有点问题,因为这个时候不是为0的,只有1是起点。这个时候就相当于每个点都可以是
起点了。应该是dp[0][0] = 0,其他未负无穷。有意义的设为0,其他为负无穷。

 

正解应该是枚举当前这个池塘钓的时间和上个池塘钓的时间,取最优。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

const int MAXN = 212;
int dp[MAXN][MAXN * 10], t[MAXN]; 
int diao[MAXN][MAXN], f[MAXN], d[MAXN], h, n;

int main()
{
	scanf("%d%d", &n, &h);
	h *= 12;
	REP(i, 1, n + 1) scanf("%d", &f[i]);
	REP(i, 1, n + 1) scanf("%d", &d[i]);
	REP(i, 1, n) scanf("%d", &t[i]);
	
	REP(i, 1, n + 1)
	{
		diao[i][0] = 0;
		int fish = f[i];
		REP(j, 1, h + 1)
		{
			diao[i][j] = diao[i][j-1] + fish;
			fish = max(fish - d[i], 0);
		}
	}
	
	memset(dp, -63, sizeof(dp));
	int ans = 0;
	REP(i, 0, h + 1) dp[0][i] = 0;
	REP(i, 1, n + 1)
		REP(j, t[i-1], h + 1)
			REP(k, 0, j - t[i-1] + 1)
			{
				dp[i][j] = max(dp[i][j], dp[i-1][k] + diao[i][j-t[i-1]-k]);
				ans = max(ans, dp[i][j]);
			}
	printf("%d\n", ans);
	
	return 0;
}

 

 

转载于:https://www.cnblogs.com/sugewud/p/9819421.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107345.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux netstat命令详解

    Linux netstat命令详解简介Netstat命令用于显示各种网络相关信息,如网络连接,路由表,接口状态(InterfaceStatistics),masquerade连接,多播成员(MulticastMemberships)等等。输出信息含义执行netstat后,其输出结果为ActiveInternetconnections(w/oservers)ProtoRecv-QSend-QLocalAddressForeignAddressStatetcp02210.34.6.

    2022年5月30日
    32
  • eclipse导入maven工程出现的问题「建议收藏」

    eclipse导入maven工程出现的问题「建议收藏」最近自己找了一个ssm框架想学习一下,但是用eclipse导入maven工程后出现了以下问题:error1:DescriptionResourcePathLocationTypeProjectconfigurationisnotup-to-datewithpom.xml.RunMaven4MyEclipse->UpdateProject

    2022年5月31日
    60
  • 关于大学计算机相关专业学习路线的见解与分析

    关于大学计算机相关专业学习路线的见解与分析谨以此文献给仍然迷失在大学生活中的计算机专业学子!!!不管你是如何选择了这门专业,我想告诉你的是这是一个很深的领域,没有热爱不如尽早转行。根据百度百科计算机科学与技术专业(以下简称计算机专业)给出的描述,该专业的主干课程有算法、数据结构、操作系统、编译原理、计算机组成原理、计算机体系结构、计算机网络(划重点,这些都是专业基础课,其中的任意一门拿出来都够研究一生的,虽然大学的教育基本上都是讲…

    2022年5月3日
    50
  • 最大公约数(Greatest Common Divisor)

    最大公约数(Greatest Common Divisor)

    2022年1月12日
    38
  • 深入理解Volatile关键字及其实现原理「建议收藏」

    深入理解Volatile关键字及其实现原理「建议收藏」volatile的用法volatile通常被比喻成"轻量级的synchronized",也是Java并发编程中比较重要的一个关键字。和synchronized不同,volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。volatile的用法比较简单,只需要在声明一个可能被多线程同时访问的变量时,使用volatile修饰就可以了。如以下代码,是一个比较典型的使用双…

    2022年5月12日
    40
  • snort:预处理器开发HelloWorld

    snort:预处理器开发HelloWorld文章目录参考 1 预处理器回顾 2 README PLUGINS3 spp template c 参考 Snort 预处理插件 HelloWorld 程序开发 Snort 预处理器介绍 详细 本专栏所有相关博文使用的 snort 版本均为 2 9 151 预处理器回顾预处理器在 Snort 应用规则前处理接收到的数据预处理器对每一个数据包只执行一次被捕获的数据包首先经过预处理器 然后经过探测引擎根

    2025年7月22日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号