POJ1390 Blocks——动态规划——pku1390
生活随笔
收集整理的這篇文章主要介紹了
POJ1390 Blocks——动态规划——pku1390
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
經典的動態規劃,LRJ神牛的書上經典例題第一題。
開一個三維數組,f[i][j][k]表示將i~j這一段,連上后面的k個格子全部消去所能夠獲得的最大價值。
狀態轉移方程:
f[i][j][k]=Max{
Max{f[i][p][len[j]+k]+f[p+1][j-1][0]}(color[p]=color[j] and i<p<j)//和前面某段一起消掉
f[i][j-1][0]+sqr(len[j]+k)//馬上消掉這一段
}
其中,len[i]表示第i段連續區間的長度,比如說樣例1中的len值分別為1,4,3,1
代碼很簡單:
Program POJ1390;//By_Thispoet Constmaxn=200; Vari,j,k,m,n,l,r,p,o,q :Longint;f :Array[0..maxn,0..maxn,0..maxn]of Longint;len,color,maxr,rep :Array[1..maxn]of Longint;rpos :Array[1..maxn]of Integer;rec :Array[1..maxn,0..maxn]of Longint;Function Max(i,j:Longint):Longint; beginif i>j then exit(i);exit(j); end;BEGINreadln(o);q:=o;while o>0 dobegin n:=0;l:=0;fillchar(rpos,sizeof(rpos),0);fillchar(rec,sizeof(rec),0);fillchar(len,sizeof(len),0);readln(r);for i:=1 to r dobeginread(m);if l=m then inc(len[n]) elsebegininc(n);inc(rec[m,0]);rec[m,rec[m,0]]:=n;rep[n]:=rec[m,0];color[n]:=m;len[n]:=1;end;l:=m;end;for i:=n downto 1 dobeginmaxr[i]:=rpos[color[i]];inc(rpos[color[i]],len[i]);end;//preparefillchar(f,sizeof(f),0);for i:=1 to n dofor k:=0 to maxr[i] dof[i,i,k]:=sqr(len[i]+k);for j:=1 to n-1 dofor i:=1 to n-j dofor k:=0 to maxr[i+j] dobeginf[i,i+j,k]:=f[i,i+j-1,0]+sqr(len[i+j]+k);l:=rep[i+j]-1;while l>0 dobeginp:=rec[color[i+j],l];if p<i then break;f[i,i+j,k]:=Max(f[i,i+j,k],f[i,p,k+len[i+j]]+f[p+1,i+j-1,0]);dec(l);end;end;writeln('Case ',q-o+1,':',' ',f[1,n,0]);dec(o);end;END.轉載于:https://www.cnblogs.com/Thispoet/archive/2011/10/03/2198448.html
總結
以上是生活随笔為你收集整理的POJ1390 Blocks——动态规划——pku1390的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《白蛇》团队新作!《新神榜:杨戬》发布预
- 下一篇: php中时间轴开发,即显示为“刚刚”、“