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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 动态规划经典题目汇总图_离散型动态规划经典题目

    动态规划经典题目汇总图_离散型动态规划经典题目http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.html转载之前先Orz一下:[s:19]Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总

    2025年7月9日
    0
  • 网络基础知识大全_网络基础知识入门到精通

    网络基础知识大全_网络基础知识入门到精通1)如何查看本机所开端口:用netstat-a—n命令查看!netstat结果显示有一些英文,简单说一下这些英文具体都代表什么:LISTEN:侦听来自远方的TCP端口的连接请求SYN-SENT:再

    2022年8月6日
    4
  • 一键批量打印EXCEL、WORD文档

    一键批量打印EXCEL、WORD文档

    2021年10月10日
    214
  • C语言基础知识入门(大全)「建议收藏」

    C语言基础知识入门(大全)「建议收藏」一.C语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课!更多详细进阶教程等你领取!可以关注公众号“C和C加加”回复“ZXC”即可免费获取!二.C语言的具体结构简单来说,一个C程序就是由若干头文件和函数组成。 #include<stdio.h>就是一条预处理命..

    2022年6月7日
    25
  • 具有指令流水线结构的cpu_cpu流水线技术

    具有指令流水线结构的cpu_cpu流水线技术为什么小小一个CPU,有那么多周期(Cycle)?程序的性能,是由三个因素相乘来衡量的,“指令数×CPI×时钟周期”。和周期相关的只有一个时钟周期,即CPU主频的倒数。一个CPU的时钟周期可以认为是可以完成一条最简单的计算机指令的时间。那为何构造CPU时,有那么多周期?单指令周期处理器一条CPU指令的执行,由FDE三步组成。这个执行过程,至少需花费一个时钟周期。因为在取指令的时候,我们需要通过时钟周期的信号,来决定计数器的自增。很自然,我们希望能确保让这样一整条指令的执行,在一个时钟周期内完成

    2022年8月20日
    8

发表回复

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

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