HNU-算法設計與分析-作業3

第三次作業【動態規劃】

在這里插入圖片描述

文章目錄

    • 第三次作業【動態規劃】
      • <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 4output.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.pswp.cn/diannao/13228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13228.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

postgresql安裝及性能測試

postgresql安裝及性能測試 1. Postgresql介紹 Postgresql是一款功能強大的開源對象關系型數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;以其穩定性、擴展性和標準的SQL支持而聞名。它支持復雜查詢、外鍵、觸發器、視圖、事務完整性、多版本并發控制&#xff08;MV…

Linux(七) 動靜態庫

目錄 一、動靜態庫的概念 二、靜態庫的打包與使用 2.1 靜態庫的打包 2.2 靜態庫的使用 三、動態庫的打包與使用 3.1 動態庫的打包 3.2 動態庫的使用 3.3 運行動態庫的四種方法 四、總makefile 一、動靜態庫的概念 靜態庫&#xff1a; Linux下&#xff0c;以.a為后綴的…

Python專題:十五、JSON數據格式

Python的數據處理&#xff1a;JOSN 計算機的主要工作&#xff1a;處理數據 最容易處理的數據就是結構化數據 非結構化數據&#xff1a;視頻&#xff0c;文件等 近些年的大數據、數據挖掘就是對互聯網中的各種非結構化的數據的分析和處理 半結構化數據 明確的結構屬性&…

陪診服務運用預約小程序的效果是什么

在中高型城市里&#xff0c;陪診師近些年也很有熱度&#xff0c;已經衍生成為一個新的小眾行業&#xff0c;不同醫院/不同科目等其它情況針對不同群體往往很難完善&#xff0c;比如部分老年人腿腳不便、不認識字、外地語言難以溝通等&#xff0c;陪診師的作用就尤為凸顯. 對相…

[Bootloader][uboot]code總結

文章目錄 1、U_BOOT_DRIVER2、DM框架dm_scan_platdatadm_extended_scan_fdt 1、U_BOOT_DRIVER 使用這個宏可以定義一個驅動實例&#xff0c;宏定義是 其中使用的struct driver結構體 使用的ll_entry_declare宏定義是 歸結為 2、DM框架 1、 DM框架 DM模型抽象出了以下四個…

16.投影矩陣,最小二乘

文章目錄 1. 投影矩陣1.1 投影矩陣P1.2 投影向量 1. 投影矩陣 1.1 投影矩陣P 根據上節知識&#xff0c;我們知道當我們在解 A X b AXb AXb的時候&#xff0c;發現當向量b不在矩陣A的列空間的時候&#xff0c;我們希望的是通過投影&#xff0c;將向量b投影到矩陣A的列空間中&…

ModuleNotFoundError: No module named ‘sklearn‘

ModuleNotFoundError: No module named sklearn 解決辦法&#xff1a; pip install scikit-learn

7B2 PRO主題5.4.2免授權直接安裝

B2 PRO 5.4.2 最新免授權版不再需要改hosts&#xff0c;直接在wordpress上傳安裝即可

網站接入百度云防護CDN后回源率非常高原因

最近&#xff0c;有站長反饋網站接入百度云防護后&#xff0c;網站回源率非常高。 今天百度云來給大家講解下&#xff0c;CDN回源高的原因&#xff1a; 1.動態請求比較多 網站的動態請求很多&#xff0c;一般是回源率高的主要原因&#xff0c;因為CDN對待動態請求是每個請求…

Vue的學習 —— <網絡請求庫Axios>

目錄 前言 正文 一、Axios基本概念 二、安裝Axios 三、Axios使用方法 四、向服務器發送請求 前言 在之前的開發案例中&#xff0c;我們通常直接在組件中定義數據。但在實際的項目開發中&#xff0c;我們需要從服務器獲取數據。當其他用戶希望訪問我們自己編寫的網頁時&a…

定檔 11.2-3,COSCon'24 第九屆中國開源年會暨開源社十周年嘉年華正式啟動!

中國開源年會 COSCon 是業界最具影響力的開源盛會之一&#xff0c;由開源社在2015年首次發起&#xff0c;今年將舉辦第九屆。 以其獨特定位及日益增加的影響力&#xff0c;COSCon 吸引了越來越多的國內外企業、高校、開源組織/社區的大力支持。與一般企業、IT 媒體、行業協會舉…

網絡安全快速入門(十三)linux及vmware軟件的網絡配置

13.1 前言 在通過我們前面的了解&#xff0c;我們現在已經對Linux的基礎知識有了大致的了解&#xff0c;今天我們來大概講一下關于linux系統及vmware的網絡配置問題&#xff0c;在這之前&#xff0c;我們需要對網絡有一個大概的認識和了解&#xff0c;話不多說&#xff0c;我們…

01記-“計算機基礎知識”

感覺媒體: 直接作用于人的感覺器官&#xff0c;使人產生直接感覺的媒體&#xff1a;聲音、圖形、圖像、動畫等。 表示媒體: 為了加工、處理和傳輸感覺媒體而人為研究、構造出來的一種媒體&#xff0c;常見的有各種編碼方式&#xff0c;如文本編碼、圖像編碼和聲音編碼等。 …

Java中靜態方法為什么不能調用非靜態成員?

在Java面試中&#xff0c;這個問題經常被問到&#xff0c;因為它不僅涉及到Java的基本語法規則&#xff0c;還深入到了JVM的工作機制。理解這個問題可以幫助面試者更好地掌握Java的靜態和非靜態成員的區別以及它們在內存中的分配和使用。 靜態成員 vs 非靜態成員 首先&#x…

AtCoder Beginner Contest 318 A題 Full Moon

A題&#xff1a;Full Moon 標簽&#xff1a;模擬、數學題意&#xff1a;給定一個起始 m m m和上限 n n n&#xff0c;每次增量 p p p&#xff0c;求能加幾次。題解&#xff1a;數據比較小&#xff0c;可以直接暴力&#xff1b;數學方法算的話&#xff0c;注意邊界。代碼&#…

HNU-算法設計與分析-作業5

第五次作業【回溯算法】 文章目錄 第五次作業【回溯算法】<1> 算法分析題5-3 回溯法重寫0-1背包<2> 算法分析題5-5 旅行商問題&#xff08;剪枝&#xff09;<3> 算法實現題5-2 最小長度電路板排列問題<4> 算法實現題5-7 n色方柱問題<5> 算法實現…

時間格式數據向前或向后歸于整時

假設你有一個“時:分:秒”的時間格式數據&#xff0c;例如"12:34:56"&#xff0c;你想要將它向前歸整于整時或者向后歸整于整時&#xff0c;可以按照以下方法進行處理&#xff1a; 1、向前歸整于整時&#xff1a;將分鐘和秒數設置為0 import datetime# 原始時間 ti…

公共字段填充(AOP的使用)

Thread是線程池,ThreadLocal是線程變量,每個線程變量是封閉的,與其它線程變量分隔開來,在sky-common下的com.sky.context包下有一個Basecontext類 public class BaseContext {//每一個上下文創建了一個線程變量,用來存儲long類型的id//創建三個方法,用來設置,取用,刪除idpubli…

絕地求生:PGS3參賽隊伍跳點一覽,17壓力有點大,4AM與PeRo大概率不roll點

在PCL春季賽結束后&#xff0c;PGS3的參賽隊伍名單以及分組就正式確定了&#xff0c;最后確定名額的DDT和NH被安排在了A組和B組&#xff0c;感覺這次PGS3的分組比較均衡&#xff0c;沒有“死亡之組”一說。這段時間已經有網友匯總了PGS3隊伍在各個地圖的跳點&#xff0c;并且把…

「AIGC算法」近鄰算法原理詳解

本文主要介紹近鄰算法原理及實踐demo。 一、原理 K近鄰算法&#xff08;K-Nearest Neighbors&#xff0c;簡稱KNN&#xff09;是一種基于距離的分類算法&#xff0c;其核心思想是距離越近的樣本點&#xff0c;其類別越有可能相似。以下是KNN算法的原理詳解&#xff1a; 1. 算…