题解:2018级算法第二次上机 Zexal的钢管切割

题目描述:

样例:

实现解释:

经典钢管切割问题的变形:最赔钱切割

知识点:动态规划,钢管切割

实现方法即得出状态转移方程后完善为代码即可,先设数组price[i]存储着i长度钢管切割后的最小值,p[i]存储着i长度钢管不切割的值,price数组既是本问题的dp数组。

经过分析可知状态转移方程为:

price[0] = 0;

price[i] = min(p[1]+price[i-1],p[2]+price[i-2],...p[i-1]+price[1],p[i]);

因为price[i]已经是当前情况下的最小值了,所以只需要遵循转移方程进行代码的完善即可。

坑点:

初始化和状态转移方程的书写

完整代码:

//钢管切割最小值
#include<iostream>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	int length,MIN;//分别为长度和最小值
	while(cin >> length)
	{
		int p[length+1];
		for(int i = 1;i<=length;i++)
			cin >> p[i];//依据题意,i长度的价值 

		int price[length+1];//保存每段价值
		price[0] = 0;//会使用到price[0],防止出错初始化 

		for(int i = 1;i<=length;i++)
		{
			MIN = 2147483647;//获得最小值时需要设为最大值
			for(int j = 1;j<=i;j++)
			{
				if(MIN > p[j]+price[i-j])
				//不断将i长度切割为前j部分和后i-j部分
				//以找到i长度切割后的最小值
				{
					MIN = p[j] + price[i-j];//替换最小值
					price[i] = MIN;
				}
				//状态转移方程介绍见实现解释
			}
		}
		cout << price[length] << ‘\n‘;
		//输出最长部分(i)切割后的最小值
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/doUlikewyx/p/11700775.html

时间: 2024-07-30 13:34:11

题解:2018级算法第二次上机 Zexal的钢管切割的相关文章

题解:2018级算法第二次上机 Zexal的排座位

题目描述: 样例: 实现解释: 一道看似复杂但实际既是斐波那契变形的题目 知识点:递推,斐波那契 通过问题的描述,可以得到以下规律:(除了座位数为一时)男生坐最后时,倒数第二个一定是女生:女生坐最后,倒数第二个均可.转化:i个位置时男生结尾的情况数等于i-1个位置时女生结尾的情况数,i个位置时女生结尾的情况数等于i-1个位置时的总情况数. 于是便可得出两种解决方案:斐波那契变形和直接循环递推 斐波那契变形: i位置男生结尾的情况 = i-1位置女生结尾情况数 = i-2位置总情况数 i位置女生结

题解:2018级算法第二次上机 Zexal的流水线问题

题目描述: 样例: 实现解释: 最基础的流水线调度问题,甚至没有开始和结束的值 知识点:动态规划,流水线调度 实现方法即得出状态转移方程后完善即可,设a[][i]存储着第一二条线上各家的时间花费,t[][i]存储着i处进行线路切换的花费,f[][i]存储着各线在i处的最小花费. 则对每一个f[][i]应有如下的转移方程: f[0][1] = a[0][1]; f[1][1] = a[1][1]; f[0][i] = min(f[0][i-1]+a[0][i],f[1][i-1]+t[1][i-1

题解:2018级算法第二次上机 Zexal的竞赛

题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1的总分. 于是便可先利用score[i]储存i分数的总分数,用dp[i]储存以前i个分数为范围进行题目选择时的最大可获得分数.dp便是动态规划所用的数组. 于是可得状态转移方程如下: dp[0] = score[0]; dp[1] = score[1]; dp[i] = max(dp[i-2]+sc

P2-2017级算法第二次上机 A ModricWang‘s Real QuickSort Query

题目描述 羊瑞大佬说:"现在的年轻人啊,写个快排都能写错,比如那个辣鸡的ModricWang"觉得他说的情况是真的,决定帮自己复习一下快排的写法. 快排的一个基础操作就是划分(partition),就是将当前的数组分为前后两个部分. 一种较为经典的partition方法是,将数组中处于中间位置(注意,只和位置有关,和大小无关)的元素作为分隔元素,然后将小于它的元素放到左侧,大于它的元素放到右侧,然后对左右两侧分别进行递归操作.在此题中为了统一,如果数组长度为偶数,取靠后的一个作为分隔元

2017级算法第二次上机-C.芸如的入学测试

这道题考察的实际就是一个简单的前缀和问题.值的注意的还是取模的问题.两个数取模,以防万一,出现对负数取模的问题 可以先加上mod然后再对mod取模. 能long long就不int #include <algorithm> #include <iostream> using namespace std; const int maxlen = 1e6 + 10; const int mod = 10007; long long ar[maxlen]; long long prefix

2017级算法第二次上机-E.SkyLee的图书整理

这道题考察了map函数的使用,map最简单的理解就是把一个数映射到一个数.然后使用map也类似hash数组的方法即可 map的头文件是<map> map<int,int> 将一个数映射到一个数 #include <algorithm> #include <iostream> #include <map> using namespace std; int main(){ int n,t,x,i,j,k; while(~scanf("%d

P2-2017级算法第二次上机 C 第k顺序统计量

题目描述 给定3个整数A, B, C, 和数组第一个数a[1].数组a由如下方式得到.询问a中第k小的数是多少. for(int i = 2; i <= 3000000; ++i) a[i] = ((1LL * a[i - 1] * A ^ B) + C) % 1000000007; 输入 多组组数据,每组数据一行,数据组数不超过7 每行5个整数A, B, C, a[1], k (保证五个数为int范围内正整数且k在3000000范围内) 输出 对于每组数据,输出一行,第k小的数. 输入样例 4

解题报告——-2018级2016第二学期第三周作业

解题报告——2018级2016第二学期第三周作业 A:[NOIP2002P]过河卒 题目: 描述 如图,A 点有一个过河卒,需要走到目标 B   点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C  点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20  的整数,并由键盘输入)

解题报告——2018级2016第二学期第二周作业

解题报告——2018级2016第二学期第二周作业 D:迷宫问题 题目描述: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. 输入 一个5 × 5的二维数组,表示一个迷宫.数据保证有唯一解. 输出 左上角到右