HNU-算法设计与分析-作业3

news2025/6/18 6:57:19

第三次作业【动态规划】

在这里插入图片描述

文章目录

    • 第三次作业【动态规划】
      • <1>算法实现题 3-1 独立任务最优解问题
      • <2>算法实现题 3-4 数字三角形问题
      • <3>算法实现题 3-8 最小m段和问题
      • <4>算法实现题 3-25 m处理器问题

<1>算法实现题 3-1 独立任务最优解问题

▲问题重述

用两台处理机A 和 B处理n 个作业。设第个作业交给机器A处理时需要时间ai,若由机器 B 来处理,则需要时间 b。由于各作业的特点和机器的性能关系,可能对于某些,有azb,而对于某些jjfi),有ab。既不能将一个作业分开由两台机器处理也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这两台机器处理完这n
个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例:(a1,a2,a3,a4,as,a6)=(2,5,7,10,5,2),(b, b2,b, b4, bs, b6)=(3,8,4,11,3,4)。

算法设计:对于给定的两台处理机A 和 B 处理个作业,找出一个最优调度方案,使2
台机器处理完这n个作业的时间最短。

数据输入:由文件 inputtxt 提供输入数据。文件的第1行是1个正整数n,表示要处理
n个作业。在接下来的2行中,每行有n个正整数,分别表示处理机A和B 处理第i个作业需要的处理时间。

案例:

input.txt
6
2 5 7 10 5 2
3 8 4 11 3 4

output.txt
15

▲解题思路

状态转移方程:dp[i][j]=min(dp[i-1][j]+b[i],dp[i-1][j-a[i]]);

dp[i][j]代表做完前i个任务,A机器花几分钟情况下,B机器所花的时间,也就是说dp[i][j]就是表示B机器所花时间。

dp[i][j] = dp[i-1][j]+b[i]代表第i个任务交给B来做,所以做完前i个任务的时候,A机器和前i - 1的任务一样,还是花了j分钟,而B机器则花dp[i-1][j]+b[i]分钟;

dp[i][j] = dp[i-1][j-a[i]]代表第i个任务交给A来做,现在的A机器花费时间是j,所以在前i - 1个任务完成的时候,A机器是花了j-a[i]分钟的,所以现在B机器还是花了dp[i-1][j-a[i]]分钟;

一直到dp[n][i]:代表所有的任务都做完了,B机器所花费的时间,那么最迟的时间就是B的时间和A的时间求最大值;

最后这个循环for(int i=0; i<=sum; i++)ans=min(ans,max(dp[n][i],i));//max(dp[n][i],i) 表示完成前n个作业A机器花i分钟 B机器花dp[n][i]分钟情况下,最迟完工时间

▲代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + 100;
const double eps = 1e-6;
int Data[MAXN];
int a[MAXN], b[MAXN];
int dp[500][1000];
int main(){
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int n;
    int maxn = 0;
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> a[i];
        maxn += a[i];
    }
    for(int i=1;i<=n;i++) cin >> b[i];
    for(int i=1;i<=n;i++){
        for(int j=0;j<=maxn;j++){
            if(j < a[i]){   
                dp[i][j] = dp[i - 1][j] + b[i];
            }else{
                dp[i][j] = min(dp[i - 1][j - a[i]], dp[i - 1][j] + b[i]);
            }
        }
    }
    int ans = INF;
    for(int i=0;i<=maxn;i++){
        if(i < dp[n][i]){
            ans = min(ans, dp[n][i]);
        }else{
            ans = min(ans, i);
        }
    }
    cout << ans;
    return 0;
}

▲验证

在这里插入图片描述

<2>算法实现题 3-4 数字三角形问题

▲问题重述

定一个由n行数字组成的数字三角形,试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。数据输入: 由文件input.txt提供输入数据。文件的第1行是数字三角形的行数n,(1≤n≤100)。接下来n行是数字三角形各行中的数字。所有数字在0~99之间。结果输出:将计算结果输出到文件output.txt。文件第1行中的数是计算出的最大值。示例:如右图所示,从 7→3→8→7→5的路径产生了最大权值30。

在这里插入图片描述

▲解题思路

这道题可以用动态规划来做,重点是表示状态和写状态转移方程设 v[i,j] 为点 (i,j) 上的值,f[i,j] 表示由 (1,1) 到 (i,j) 的路径最大总和,则 f[i,j]=Max{f[i-1,j-1],f[i-1,j]}+v[i,j]。

此处注意“左上角点”对应的是点 (i-1,j-1),右上角对应的是点 (i-1,j)。边界条件更加容易想到,是 f[i][0]=f[0][j]=0 (0<=i,j<=n)。最后还需注意一点。如果浅学过DP可能下意识输出 f[n][n],但根据题目中“到底部任意处结束”可以看出,总和最大的路径可能终结于 (n,1) 到 (n,n) 的任意一点,最后还需要再从中寻找最大的 f[n,j]。

整理思路,首先二重循环输入三角形存储于 a[][] 中,再设一 f[][] 用二重循环求解后,从 f[n][1]f[n][n] 中找到最大值输出。

▲代码

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

▲验证:

洛谷P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles(https://www.luogu.com.cn/problem/P1216)

在这里插入图片描述

<3>算法实现题 3-8 最小m段和问题

▲问题重述

给定n个整数组成的序列,现在要求将序列分割成m段,每段子序列中的数在原数列中连续排列。如何分割才能使m段子序列的和的最大值达到最小?

数据读入/读出:

第一行中有2个正整数n和m。正整数n是序列的长度,正整数m是分割的段数。接下来的一行中有n个整数。

▲解题思路

使用dp[i][j]放置将前i个数分成j段的最大最小值。
所以dp[i][1]就是前i个数的和,dp[i][1] = dp[i-1][1] + a[i];
当j>1的时候,假设前k个数为j-1段,从k~i为第j段,所以前j-1段的最大最小值为:dp[k][j-1] (前k个数分为j-1段).
最后一段为:dp[i][1]-dp[k][1] (前i个数的和减去前k个数的和)
这两个值中选取一个最大值,当所有情况讨论结束后,选出结果中最小的作为dp[i][j]的值。

因此,状态转移方程为

dp[i][j] = min{ max{ dp[k][j-1], dp[i][1]-dp[k][1] } } (0<k<i)

▲代码

#include <iostream>
using namespace std;

int dp[500][500];
int t[500];
void solve(int n, int m)
{
    int i, j, k, temp, maxt;
    for (i = 1; i <= n; i++)
        dp[i][1] = dp[i - 1][1] + t[i];
    for (j = 2; j <= m; j++)
    {
        for (i = j; i <= n; i++)
        {
            for (k = 1, temp = INT_MAX; k < i; k++)
            {
                maxt = max(dp[i][1] - dp[k][1], dp[k][j - 1]);
                if (temp > maxt)
                    temp = maxt;
            }
            dp[i][j] = temp;
        }
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    if ((n < m) || (n == 0))
    {
        cout << 0 << endl;
        return 0;
    }
    for (int i = 1; i <= n; i++)
        cin >> t[i];
    solve(n, m);
    cout << dp[n][m] << endl;
}

▲验证

在这里插入图片描述

<4>算法实现题 3-25 m处理器问题

▲问题重述

在这里插入图片描述

▲解题思路

在这里插入图片描述

▲代码

#include <cmath>
#include <iostream>
using namespace std;

double g[500][500];
double t[500];
int n, m;

double f(int a, int b)
{
    double ret = 0;
    for (int i = a; i <= b; i++)
    {
        ret += (t[i] * t[i]);
    }
    return sqrt(ret);
}

double solve()
{
    int i, j, k;
    double tmp, maxt;
    tmp = f(n - 1, n - 1);
    for (i = n - 1; i >= 0; i--)
    {
        if (f(i, i) > tmp)
            tmp = f(i, i);
        g[i][1] = f(i, n - 1);
        if (n - i <= m)
            g[i][n - i] = tmp;
    }
    for (i = n - 1; i >= 0; i--)
    {
        for (k = 2; k <= m; k++)
        {
            for (j = i, tmp = INT_MAX; j <= n - k; j++)
            {
                maxt = max(f(i, j), g[j + 1][k - 1]);
                if (tmp > maxt)
                    tmp = maxt;
            }
            g[i][k] = tmp;
        }
        for (k = n - i + 1; k <= m; k++)
            g[i][k] = g[i][n - i];
    }
    return g[0][m];
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> t[i];
    }
    cout << solve() << endl;
}

▲验证

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 安装mysql 和 Redis

mysql Windows 图形界面安装&#xff1a; 下载mysql https://dev.mysql.com/downloads/ 1.下载完成后,找到文件双击安装程序 2. 等待一段时间&#xff0c; 选择默认&#xff0c;点击next 3. 选择安装目录 下载mysql产品 安装mysql产品 产品配置向导 安装…

数据库-索引结构(B-Tree,B+Tree,Hash,二叉树)

文章目录 索引结构有哪些&#xff1f;二叉树详解&#xff1f;B-Tree详解?BTree详解&#xff1f;Hash详解&#xff1f;本篇小结 更多相关内容可查看 索引结构有哪些&#xff1f; MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引擎有不同的索引结构&#xff0c;主要包…

Echart-折线图根据区间设置折线的样式

根据X轴区间设置折线样式 完整配置如下&#xff1a; option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [150, 230, 224, 218, 135, 147, 260],type: line}],//【注】&#xff1a;如果一个图中有多个折线&a…

ROS从入门到精通4-3:制作Docker镜像文件Dockerfile

目录 0 专栏介绍1 为什么需要Dockerfile&#xff1f;2 Dockerfile书写原则3 Dockerfile常用指令3.1 FROM3.2 MAINTAINER3.3 RUN3.4 ADD3.5 COPY3.6 CMD3.7 ENV3.8 EXPOSE3.9 WORKDIR3.10 ARG 4 Dockerfile构建ROS工程实例 0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0…

springboot3.2.5+mybatis-plus导致启动报错

公司新的项目升级到了springboot3.x后&#xff0c;步步是坑&#xff0c;坑坑不同&#xff0c;各种疑难杂症层出不穷&#xff0c;让老中医也也苦不堪言&#xff0c;java的生态圈真让人无语&#xff0c;你们升级能不能认真些互相兼顾一下&#xff1f; 这次的项目用了springboot3…

Python自学之路--004:Python使用注意点(原始字符串‘r’\字符转换\‘wb’与‘w区别’\‘\‘与‘\\’区别)

目录 1、原始字符串‘r’ 2、字符转换问题 3、open与write函数’wb’与’w’区分 4、Python里面\与\\的区别 1、原始字符串‘r’ 以前的脚本通过Python2.7写的&#xff0c;通过Python3.12去编译发现不通用了&#xff0c;其实也是从一个初学者的角度去看待这些问题。 其中的\…

春风拂面,深入浅出:Bean 处理器揭秘 Spring Boot 启动之谜

春风拂面&#xff0c;深入浅出&#xff1a;Bean 处理器揭秘 Spring Boot 启动之谜 在 Spring Boot 开发中&#xff0c;Bean 处理器扮演着至关重要的角色&#xff0c;犹如幕后英雄般默默地为应用启动过程添砖加瓦。然而&#xff0c;对于许多开发者来说&#xff0c;Bean 处理器依…

文档分类FastText模型 (pytorch实现)

文档分类FastText FastText简介层次softmaxN-gram特征FastText代码&#xff08;文档分类&#xff09; FastText简介 FastText与之前介绍过的CBOW架构相似&#xff0c;我们先来会议一下CBOW架构&#xff0c;如下图&#xff1a; CBOW的任务是通过上下文去预测中间的词&#xff0…

项目管理重点及笔记【太原理工大学24年】

为了自己复习写的&#xff0c;可能会有不清楚&#xff0c;可以选择性看可以讨论&#xff0c;但别骂我写的什么烂东西&#xff0c;&#xff0c;&#xff0c;&#xff08;电脑看排版更好看些&#xff09; 目录 一、IT项目管理概述 二、IT项目组织环境与管理过程 三、整体管理 四、…

使用httpx异步获取高校招生信息:一步到位的代理配置教程

概述 随着2024年中国高考的临近&#xff0c;考生和家长对高校招生信息的需求日益增加。了解各高校的专业、课程设置和录取标准对于高考志愿填报至关重要。通过爬虫技术&#xff0c;可以高效地从各高校官网获取这些关键信息。然而&#xff0c;面对大量的请求和反爬机制的挑战&a…

【汇编】算术指令

一、加法指令 &#xff08;一&#xff09;各加法指令的格式及操作 加法指令可做字或字节运算 &#xff08;1&#xff09;加法指令 ADD 格式&#xff1a;ADD DST,SRC执行的操作&#xff1a;(DST) ← (SRC)(DST) &#xff08;2&#xff09;带进位加法指令 ADC 格式&#xf…

【C语言】自定义类型之---结构体超详解(结构体的定义使用、指针结构体,内存对齐,......代码详解)

目录 前言&#xff1a; 一&#xff1a;结构体 1.1&#xff1a;什么是结构体&#xff1f; 1.2&#xff1a;结构体类型的声明 1.3&#xff1a;结构体变量的定义 1.4&#xff1a;结构体的内存对齐 1.5&#xff1a;结构体传参 二&#xff1a;位段 2.1&#xff1a;位段是什…

反爬-简单滑块思路,秒了~

文章目录 找图片的返回包curl 大法获取图片链接ddddocr分析距离看结果秒了~ 本文仅供参考学习&#xff0c;如有侵权&#xff0c;请联系作者删。 目标地址&#xff1a;aHR0cHM6Ly9pZHMuZ2RpdC5lZHUuY24vYXV0aHNlcnZlci9sb2dpbj9zZXJ2aWNlPWh0dHBzOi8vd2JkdC5nZGl0LmVkdS5jbi9zaG…

2024 Google I/O Android 相关内容汇总

2024 Google I/O Android 相关内容汇总 本次 Google I/O 的核心虽然是 AI &#xff0c;但是 Android 也是作为主要议题出现&#xff0c; Android 部分可以简单分为产品和开发相关内容&#xff0c;接下来主要介绍这两部分的相关更新。 重点开始开发相关&#xff0c;内容不少 产…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间&#xff1a;2010-2024年 2、指标&#xff1a;行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围&#xff1a;310个地级市 4、来源&#xff1a;国家发改委 5、指标解释&#xff1a; 社会信用体…

webpack优化构建速度示例-babel-loader开启缓存cacheDirectory:

babel-loader 默认并没有开启缓存。尽管babel-loader有自己的缓存机制&#xff0c;但它并不与webpack的缓存机制相冲突。相反&#xff0c;它们可以协同工作&#xff0c;以提供最佳的构建性能。 src/index.js import {otherSomeFuction} from ./module; console.log(otherSomeF…

LeetCode322:零钱兑换

题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

Kotlin核心编程知识点-02-面向对象

文章目录 1.类和构造方法1.1.Kotlin 中的类及接口1.1.1.Kotlin 中的类1.1.2.可带有属性和默认方法的接口 1.2.更简洁地构造类的对象1.2.1.构造方法默认参数1.2.2.init 语句块1.2.3.延迟初始化&#xff1a;by lazy 和 lateinit 1.3.主从构造方法 2.不同的访问控制原则2.1.限制修…

24长三角A题思路+分析选题

需要资料的宝子们可以进企鹅获取 A题 问题1&#xff1a;西湖游船上掉落华为 mate 60 pro 手机 1. 手机掉落范围分析 物品特征&#xff1a;华为 mate 60 pro 手机的尺寸、重量、形状等特性。静水假设&#xff1a;西湖水面平静&#xff0c;不考虑水流影响。掉落位置&#xff…

多态:解锁面向对象编程的无限可能

1. 概述 多态&#xff08;Polymorphism&#xff09;是面向对象编程的三大核心特性之一&#xff08;另两个是封装和继承&#xff09;。多态意味着不同的对象对同一消息做出不同的响应。简单来说&#xff0c;多态允许你使用父类引用指向子类对象&#xff0c;并且当调用方法时&am…