日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Tyvj1114 搭建双塔]

發(fā)布時(shí)間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Tyvj1114 搭建双塔] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[題目來源]:VIjos

[關(guān)鍵字]:動(dòng)態(tài)規(guī)劃

[題目大意]:用n塊水晶搭建兩個(gè)塔,要求雙塔必須一樣高,問最大能達(dá)到的高度為多少。

//============================================================================================================

[分析]:用f[i,j]表示使用前i個(gè)水晶,建起高度差為j的雙塔時(shí),較矮的那個(gè)塔的最大高度是多少。這樣的話,對(duì)于每一塊水晶都有三種決策,不使用,放到高塔上,放到矮塔上.而放到矮塔上會(huì)有兩種情況,一是使矮塔的高度超過了高塔,二是沒有超過。具體如下:
if f[1-t,j]>f[t,j] then f[t,j]:=f[1-t,j];//不使用
if f[1-t,j]>f[t,j+h[i]] then f[t,j+h[i]]:=f[1-t,j];//高塔
if j>=h[i]//判斷會(huì)不會(huì)使矮塔變成高塔
?then
?begin
  if f[1-t,j]+h[i]>f[t,j-h[i]] then f[t,j-h[i]]:=f[1-t,j]+h[i];
?end//不會(huì)
?else
?begin
  if f[1-t,j]+j>f[t,h[i]-j] then f[t,h[i]-j]:=f[1-t,j]+j;
?end;//會(huì)
?這樣DP就可以了。邊界是f[0,0]:=0;目標(biāo)是f[n,0];
//出自tyvj1114題解

//==========================================================================================================

[代碼]:

View Code 1 program Project1;
2 var
3 n: longint;
4 a, s: array[0..200] of longint;
5 f: array[0..200,0..2500] of longint;
6
7 procedure init;
8 var
9 i: longint;
10 begin
11 readln(n);
12 for i := 1 to n do read(a[i]);
13 for i := 1 to n do s[i] := s[i-1]+a[i];
14 end;
15
16 procedure work;
17 var
18 i, j: longint;
19 begin
20 fillchar(f,sizeof(f),200);
21 f[0,0] := 0;
22 for i := 1 to n do
23 for j := 0 to s[i] do
24 begin
25 if f[i-1,j] > f[i,j] then f[i,j] := f[i-1,j];
26 if f[i-1,j] > f[i,j+a[i]] then f[i,j+a[i]] := f[i-1,j];
27 if j >= a[i] then
28 if f[i-1,j]+a[i] > f[i,j-a[i]] then f[i,j-a[i]] := f[i-1,j]+a[i];
29 if j < a[i] then
30 if f[i-1,j]+j > f[i,a[i]-j] then f[i,a[i]-j] := f[i-1,j]+j;
31 end;
32 if f[n,0] > 0 then writeln(f[n,0]) else writeln('Impossible');
33 end;
34
35 begin
36 assign(input,'c:\1.in');reset(input);
37 assign(output,'c:\1.out');rewrite(output);
38 init;
39 work;
40 close(input);
41 close(output);
42 end.

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/procedure2012/archive/2011/11/09/2243319.html

總結(jié)

以上是生活随笔為你收集整理的[Tyvj1114 搭建双塔]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。