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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 1390(消除方块(blocks))

發布時間:2024/4/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 1390(消除方块(blocks)) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天中午從黑書上看到了的一道例題,動態規劃——>線性模型的例1題。

看書都看不懂!

后面還是看了網上的題解,才漸漸明白......

估計我也說不清楚,所以盡力好了。

樣例:

1 2 2 2 2 3 3 3 1

我們建立兩個數組 :color, num.

其中,color儲存的是顏色值,Num是相同顏色的個數。

例如,對上面的樣例來說,我們就有:color[1..4]:=(1,2,3,1). num[1..4]:=(1,4,3,1).

我是看結題報告才懂的。所以覺得如果我沒看題解,我實在是想不出這種狀態來。

f[i,j,k]表示合并第i到第j組色塊所得到的最大分,至于這個k,他其實是第j組之后的某一個和j組的color值相等的組的長度,現在可能說不清,慢慢講清吧。

該狀態有兩種決策方式:

1.直接合并第j組,再合并i到j-1組。 ? 此時f[i,j,k]:=f[i,j-1,0]+(num[j]+k)^2.(這個又出現了,為什么會有這個K,他是在上一層遞歸中加入進來的,繼續看下面可能就明白了)。

2.不直接合并而是在i 和j-1 中找到某一組,并且該組的顏色與第j組顏色相同,設為p,先將p+1到j-1組合并,然后p和j因為顏色相同,自然就合成為一組了,假設合并的組還是p。

此時p的長度就為(num[p]+num[j])了,k的作用就在于此:

f[i,j,k]:=f[i,p,k+num[j]]+f[p+1,j-1,0].

為什么k會變成k+num[j]呢? 看下圖:

如: 先合并 7,8,9,再合并 5,6,10,11,我們可以等效為第二張圖,把5,6,10,11看成整體,由于該整體的num值不再為前者的num值,我們需要一個附加值來表示當前的num,這個附加的num就是k,顯然k為當前附加值再加上等效后所需要的附加值,在這里k為2.

所以,方程就的出來了!

f[i,j,k]:=max(f[i,j-1,0]+(num[j]+k)^2,f[i,p,k+num[j]]+f[p+1,j-1,0])。(其中i<=p<j 并且 color[p]=color[j]).

answer:=f[1,n,0].

接下來就很好辦了.

代碼:

1 program p1390; //uses math;2 {var3 i,n:longint;4 =================================================5 procedure mainn;}6 var7 i,j,k,l,m,q,m2,n,n2:longint;8 color,num,s:array[0..200]of longint;9 f:array[0..200,0..200,0..200]of longint; 10 function max(a,b:longint):longint; 11 begin 12 if a>b then exit(a) 13 else exit(b); 14 end; 15 function haha(l,r,k:longint):longint; 16 var 17 i,j,m,n,p:longint; 18 begin 19 if f[l,r,k]<>0 then exit(f[l,r,k]); 20 if l=r then exit((num[r]+k)*(num[r]+k)); 21 f[l,r,k]:=haha(l,r-1,0)+(num[r]+k)*(num[r]+k); 22 for i:=l to r-1 do 23 begin 24 if color[i]=color[r] then 25 begin 26 f[l,r,k]:=max(f[l,r,k],haha(l,i,num[r]+k)+haha(i+1,r-1,0)); 27 end; 28 end; 29 haha:=f[l,r,k]; 30 end; 31 begin 32 assign(input,'p1390.in'); 33 reset(input); 34 assign(output,'haha.out'); 35 rewrite(output); 36 read(n2); 37 for q:=1 to n2 do 38 begin 39 fillchar(s,sizeof(s),0); 40 fillchar(f,sizeof(f),0); 41 fillchar(num,sizeof(num),0); 42 fillchar(color,sizeof(color),0); 43 read(n); 44 j:=0; 45 for i:=1 to n do 46 read(s[i]); 47 i:=1; 48 while i<=n do 49 begin 50 m:=s[i]; 51 inc(j); 52 color[j]:=s[i]; 53 while color[j]=s[i] do 54 begin 55 inc(i); 56 inc(num[j]); 57 end; 58 end; 59 writeln('Case ',q,': ',haha(1,j,0)); 60 end; 61 close(input); 62 close(output); 63 end. 64 {==============================================} 65 {begin 66 readln(n); 67 for i:=1 to n do 68 mainn; 69 end.}

?

轉載于:https://www.cnblogs.com/zyxx233/archive/2012/12/11/2813749.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的poj 1390(消除方块(blocks))的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。