動態規劃練習題及解答

2021-03-04 09:33:17 字數 4267 閱讀 5440

[題1] 多公尺諾骨牌(domino)

問題描述:有一種多公尺諾骨牌是平面的,其正面被分成上下兩部分,每一部分的表面或者為空,或者被標上1至6個點。現有一行排列在桌面上:

頂行骨牌的點數之和為6+1+1+1=9;底行骨牌點數之和為1+5+3+2=11。頂行和底行的差值是2。這個差值是兩行點數之和的差的絕對值。

每個多公尺諾骨牌都可以上下倒置轉換,即上部變為下部,下部變為上部。

現在的任務是,以最少的翻轉次數,使得頂行和底行之間的差值最小。對於上面這個例子,我們只需翻轉最後乙個骨牌,就可以使得頂行和底行的差值為0,所以例子的答案為1。

輸入格式:

檔案的第一行是乙個整數n(1〈=n〈=1000〉,表示有n個多公尺諾骨牌在桌面上排成一行。接下來共有n行,每行包含兩個整數a、b(0〈=a、b〈=6,中間用空格分開〉。第i+1行的a、b分別表示第i個多公尺諾骨牌的上部與下部的點數(0表示空)。

輸出格式:

只有乙個整數在檔案的第一行。這個整數表示翻動骨牌的最少次數,從而使得頂行和底行的差值最小。

[題2] perform巡迴演出

題目描述:

flute市的phlharmoniker樂團2023年準備到harp市做一次大型演出,本著普及古典**的目的,樂團指揮l.y.m準備在到達harp市之前先在周圍一些小城市作一段時間的巡迴演出,此後的幾天裡,**家們將每天搭乘乙個航班從乙個城市飛到另乙個城市,最後才到達目的地harp市(樂團可多次在同一城市演出).

由於航線的費用和班次每天都在變,城市和城市之間都有乙份迴圈的航班表,每一時間,每一方向,航班表迴圈的週期都可能不同.現要求尋找一張花費費用最小的演出表.

輸入: 輸入檔案包括若干個場景.每個場景的描述由一對整數n(2<=n<=10)和k(1<=k<=1000)開始,**家們要在這n個城市作巡迴演出,城市用1..

n標號,其中1是起點flute市,n是終點harp市,接下來有n*(n-1)份航班表,乙份航班表一行,描述每對城市之間的航線和**,第一組n-1份航班表對應從城市1到其他城市(2,3,...n)的航班,接下的n-1行是從城市2到其他城市(1,3,4...n)的航班,如此下去.

每份航班又乙個整數d(1<=d<=30)開始,表示航班表迴圈的週期,接下來的d個非負整數表示1,2...d天對應的兩個城市的航班的**,**為零表示那天兩個城市之間沒有航班.例如"3 75 0 80"表示第一天機票**是75koi,第二天沒有航班,第三天的機票是80koi,然後迴圈:

第四天又是75koi,第五天沒有航班,如此迴圈.輸入檔案由n=k=0的場景結束.

輸出: 對每個場景如果樂團可能從城市1出發,每天都要飛往另乙個城市,最後(經過k天)抵達城市n,則輸出這k個航班**之和的最小值.如果不可能存在這樣的巡迴演出路線,輸出0.

樣例輸入樣例輸出:

3 6460

2 130 1500

3 75 0 80

7 120 110 0 100 110 120 0

4 60 70 60 50

3 0 135 140

2 70 80

2 32 0 70

1 80

0 0[題3] 複製書稿(books)

問題描述:假設有m本書(編號為1,2,…m),想將每本複製乙份,m本書的頁數可能不同(分別是p1,p2,…pm)。任務時將這m本書分給k個抄寫員(k〈=m〉,每本書只能分配給乙個抄寫員進行複製,而每個抄寫員所分配到的書必須是連續順序的。

意思是說,存在乙個連續公升序數列0=bo〈b1〈b2〈…輸入格式:

檔案的第一行是兩個整數m和k (1〈=k〈=m〈=500)。

第二行有m個整數p1,p2,…,pm,這m個整數均為正整數且都不超過1000000。每兩個整數之間用空格分開。

輸出格式:

檔案有k行,每行有兩個正整數。整數之間用空格分開。

第i行的兩個整數ai和bi,表示第i號抄寫員所分配得到的書稿的起始編號與終止編號。

動態規劃題參考程式:

題1:解決問題:例子的上下部分之差是6+1+1+1-(1+5+3+2)=(6-1)+(1-5)+(1-3)+(1-2)=-2,而翻轉最後乙個骨牌後,上下之差變為(6-1)+(1-5)+(1-3)+(2-1)=0。

由此看出,乙個骨牌對翻轉策略造成影響的是上下兩數之差,骨牌上的數則是次要的了。這麼一來,便把骨牌的放置狀態由8個數字變為4個: 5 -4 -2 -1,翻轉時只需取該位數字的相反數就行了。

在本題中,因為各骨牌的翻轉順序沒有限定,所以不能按骨牌編號作為階段來劃分。怎麼辦呢?考慮到隱含階段型別的問題可以按狀態最優值的大小來劃分階段。

於是,我們以骨牌序列上下兩部分的差值i作為狀態,把達到這一狀態的翻轉步數作為狀態值,記為f(i)。便有f(i)=min (-12〈=j<=12,j為偶數,且要求當前狀態有差值為j/2的骨牌)。這裡,i不是無限增大或減小,其範圍取決於初始骨牌序列的數字差的和的大小。

具體動態規劃時,如例題,我們以f(-2)=0起步,根據骨牌狀態,進行一次翻轉,可得到f(-12)=1,f(6)=1,f(2)=1,f(0)=1,由於出現了f(0),因此程式便可以結束,否則將根據四個新狀態繼續擴充套件,直至出現f(0)或者無法生成新狀態為止。

注意:在各狀態,除記錄最少步數外,還需記錄到達這一狀態時各骨牌的放置情況;而當到達某一狀態發現已記錄有一種翻轉策略時,則取步數較小的一種。

程式如下:

program domino;

type tp=array[1..6] of integer;

var t:array[1..6000] of ^tp;

f:array[-6000..6000] of integer;

l:array[1..6000] of integer;

tt:tp;

i,j,n,m,x,y,ft,re:integer;

f1,f2:text;

procedure init;

begin

assign(f1,'domino.dat');

reset(f1);

assign(f2,'domino.out');

rewrite(f2);

m:=0;

ft:=0;re:=1;new(t[1]);

fillchar(t[1]^,sizeof(t[1]^),0);

fillchar(f,sizeof(f),0);

fillchar(tt,sizeof(tt),0);

readln(f1,n);

for i:=1 to n do

begin

readln(f1,x,y);

if x<>y then

begin

x:=x-y;

inc(m,x);

inc(tt[abs(x)]);

if x>0 then inc(t[1]^[x]);

end;

end;

if m=0 then

begin

writeln(f2,0);

close(f2);

halt;

end;

l[1]:=m;

f[m]:=1;

end;

procedure main;

begin

repeat

for ft:=ft+1 to re do

begin

x:=l[ft];

for i:=1 to 6 do

begin

if x<6 then

if (t[ft]^[i] begin

inc(re);l[re]:=x+i*2;

f[l[re]]:=f[x]+1;

if l[re]=0 then

找到解便列印}

begin

writeln(f2,f[l[re]]-1);

close(f2);

halt;

end;

new(t[re]);

t[re]^:=t[ft]^;

inc(t[re]^[i]);

end;

if x>-6 then

if (t[ft]^[i]>0)and(f[x-i*2]=0) then

begin

inc(re);l[re]:=x-i*2;

f[l[re]]:=f[x]+1;

if l[re]=0 then

找到解便列印}

begin

writeln(f2,f[l[re]]-1);

close(f2);

halt;

end;

new(t[re]);

t[re]^:=t[ft]^;

dec(t[re]^[i]);

end;

線性代數練習題及解答 矩陣

一 填空題123 456 已知,則 二 選擇題 1 2 3 矩陣的標準型是 4 矩陣的最簡型矩陣是 5 矩陣的秩是 6 均為階方陣,且,則必有 7 設均為階方陣,且,則必有 8 均為階對稱矩陣,仍為對稱矩陣的充要條件是 9 均為階可逆矩陣,則 線性代數練習題 矩陣 b 一 填空題 1 設是階矩陣,是...

目標規劃練習題

多目標規劃訓練例題 某音像商店有5名全職熟練貨員和4名兼職售貨員,全職售貨員每月工作160h,兼職售貨員每月工作80h,根據過去的工作紀錄,全職售貨員每小時銷售cd25張,平均每小時工資15元,加班工資每小時22.5元,兼職售貨員每小時銷售cd10張,平均工資每小時10元,加班工資每小時10元,現在...

通訊原理概論練習題習題解答 三

習題解答 三 4 1 已知線性調製訊號表示式如下 1 2 式中,試分別畫出它們的波形圖和頻譜圖。4 2 根據圖p4 1所示的調製訊號波形,試畫出dsb及am訊號的波形圖,並比較它們分別通過包絡檢波器後的波形差別。4 2 解 4 3已知調製訊號m t cos 2000 t cos 4000 t 載波為...