"多米諾骨牌"問題的動態規劃演算法
現有n塊”多米諾骨牌”s1,s2,s3,...sn水平放成一排,每次骨牌si包含左右兩個部分,每個部分賦予一個非負整數值,如下圖所示為包含6塊骨牌的序列.骨牌可做180度旋轉,使得原來在左邊的值變到右邊,而原來右邊的值移到左邊,假設不論si如何旋轉,L[i]總是儲存si左邊的值, R[i]總是儲存si右邊的值, W[i]用於儲存si的狀態:當L[i]<=R[i]時記為0,否則記為1,試採用動態規劃演算法設計時間複雜度為o(n)的演算法
求:R[1]*L[2]+R[2]*L[3]+R[3]*L[4]+R[4]*L[5]+...++R[n-1]*L[n]的最大值,以及當取得最大值時每個骨牌的狀態.
5|8 4|2 9|6 7|7 3|9 11|10
s1 s2 s3 s4 s5 s6
#include<iostream> #include<cstdio> #include<algorithm> const int N=100; using namespace std ; int main() { int i,j,n,a,b,c,d,ans=0; int l[N],r[N],m[2][N]={0},w[N]={0},p[2][N]={0}; cin>>n; for(i=1;i<=n;i++) cin>>l[i]>>r[i]; m[0][1]=m[1][1]=0; for(i=1;i<n;i++)// { // a|b c|d // si si+1 a=l[i],b=r[i]; c=l[i+1],d=r[i+1]; if((m[0][i]+b*c)>(m[1][i]+a*c)) m[0][i+1]+=m[0][i]+b*c,p[0][i+1]=0; else m[0][i+1]+=m[0][i]+a*c,p[0][i+1]=1; if((m[0][i]+b*d)>(m[1][i]+a*d)) m[1][i+1]+=m[0][i]+b*d,p[1][i+1]=0; else m[1][i+1]+=m[0][i]+a*d,p[1][i+1]=1; } if(m[0][n]>m[1][n]) w[n]=0,cout<<m[0][n]<<endl; else w[n]=1,cout<<m[1][n]<<endl; for(i=n;i>1;i--) if(w[i]==0) w[i-1]=p[0][i]; else w[i-1]=p[1][i]; for(i=1;i<=n;i++) cout<<w[i]<<" "; }
相關推薦
"多米諾骨牌"問題的動態規劃演算法
現有n塊”多米諾骨牌”s1,s2,s3,...sn水平放成一排,每次骨牌si包含左右兩個部分,每個部分賦予一個非負整數值,如下圖所示為包含6塊骨牌的序列.骨牌可做180度旋轉,使得原來在左邊的值變到右邊,而原來右邊的值移到左邊,假設不論si如何旋轉,L[i]總是儲存si左
|洛谷|動態規劃|P1282 多米諾骨牌
http://www.luogu.org/problem/show?pid=1282 設f[i][j]為前i個骨牌差值為j的最小翻牌次數 初始值全部賦值為∞,然後f[1][a[1]-b[1]]=0,
[luoguP1282] 多米諾骨牌(DP + 背包)
getchar() digi 差值 log color pen org == close 傳送門 將問題轉換成分組背包,每一組有上下兩個,每一組中必須選則一個,上面的價值為0,下面的價值為1,求價值最小 因為要求上下兩部分差值最小,只需從背包大小為總數 / 2 時
洛谷 P1282 多米諾骨牌
gis clu 防止 pic gist load code http bsp 題目描述 多米諾骨牌有上下2個方塊組成,每個方塊中有1~6個點。現有排成行的 上方塊中點數之和記為S1,下方塊中點數之和記為S2,它們的差為|S1-S2|。例如在圖8-1中,S1=6+1+1+
P1282 多米諾骨牌
tdi 們的 oid clu inf div https 輸入 輸出 P1282 多米諾骨牌 題目描述 多米諾骨牌有上下2個方塊組成,每個方塊中有1~6個點。現有排成行的 上方塊中點數之和記為S1,下方塊中點數之和記為S2,它們的差為|S1-S2|。例如在圖8-1中,S1=
洛谷P1282 多米諾骨牌
例如 toolbar data blog 兩個 span pan art 一行 P1282 多米諾骨牌 題目描述 多米諾骨牌有上下2個方塊組成,每個方塊中有1~6個點。現有排成行的 上方塊中點數之和記為S1,下方塊中點數之和記為S2,它
【洛谷習題】多米諾骨牌
絕對值最小 gif std sizeof open ide pla int img 題目鏈接:https://www.luogu.org/problemnew/show/P1282 花了好長時間終於寫出了這道題,主要是狀態轉移方程比較奇葩,類似於背包問題,難以想
[ZJOI2009]多米諾骨牌
題面 題意 給出一張矩形表格,一些地方有障礙物,向其中放1*2的多米諾骨牌(不用填滿),要求任何相鄰兩行之間都有至少一個骨牌橫跨,任何相鄰兩列之間也都至少有一個骨牌橫跨,求方案數。 做法 為方便,用S(i,j,p,q)表示左上角為(i,j),右上角為(p,q)的子矩形 首
洛谷,P1282 多米諾骨牌 [ 揹包-好題 ]
題目描述 多米諾骨牌有上下2個方塊組成,每個方塊中有1~6個點。現有排成行的 上方塊中點數之和記為S1,下方塊中點數之和記為S2,它們的差為|S1-S2|。例如在圖8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每個多米諾骨牌可以旋轉180°,使得
多米諾骨牌:一支菸花“引燃”的創業團隊
2011年2月3日0時10分,這一天是農曆春節,正值闔家團圓之際,凌晨時分萬家燈火依舊通明。此時,在瀋陽皇朝萬鑫大廈,一則因煙花燃放引起的火災,正沿東西兩側迅速蔓延,樓層玻璃窗逐漸破碎,大火進入室內,燒穿戶門衝向走廊,節日喜悅的氛圍就此打破……接到報警電話的瀋陽
poj2411 Mondriaan's Dream (狀壓dp+多米諾骨牌問題)
這道題的解析這個部落格寫得很好 大致意思就是我們可以只處理兩行之間的關係,然後通過這兩個關係推出所有行(有點像矩陣快速冪的思想) 幾個要注意的地方 (1)第0行為全1 (2)發現自己的思維習慣還是先行在狀態,我自己寫得時候老是寫反。 (3)path的個數可能有很
poj 2663 Tri Tiling (狀壓dp+多米諾骨牌問題+滾動陣列反思)
本來直接一波狀壓dpAC的 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i
poj 3420 Quad Tiling (狀壓dp+多米諾骨牌問題+矩陣快速冪)
還有這種操作?????? 直接用pre到now轉移的方式構造一個矩陣就好了。 二進位制長度為m,就構造一個長度為1 << m的矩陣 最後輸出ans[(1 << m) - 1
P1282 多米諾骨牌 【01揹包DP】
多米諾骨牌有上下2個方塊組成,每個方塊中有1~6個點。現有排成行的 上方塊中點數之和記為S1,下方塊中點數之和記為S2,它們的差為|S1-S2|。例如在圖8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每個多米諾骨牌可以旋轉180°,使得
【容斥原理+狀態壓縮】zjoi2009 多米諾骨牌
徹徹底底的被這道題虐了,想了一個月沒想出來,最後和宇宙大總統一起強肯了2個小時標程算是看懂了。。 首先拋開這道題的那個奇怪的限制(沒行列沒有骨牌跨過),一個赤裸裸的骨牌覆蓋我都不不知道怎麼做啊!! 先看下赤裸裸的骨牌覆蓋怎麼做: 一般人的反映就會想到狀態壓縮DP,沒錯
多米諾骨牌 題解
1.題目大意 給出n個多米諾骨牌,每個牌上下兩個塊都有1~6個點,上方塊中點數之和記為S1,下方塊中 點數之和記為S2,我們可以將第i張牌翻轉,讓它上下兩個塊的點數翻轉,現在 求|S1-S2|使最小的最小交換次數 2.思路思想 首先我們可以知道s1+s2是可以確定的,且我
poj2411 2663 2420 dp+狀態壓縮(多米諾骨牌問題)
題目描述:用1*2 的矩形通過組合拼成大矩形,求拼成指定的大矩形有幾種拼法。 首先 我們先求用1*2 的矩形拼成 n*m的矩形有多少種拼法 當n*m為奇數時,一定是不會拼出來的,因為想要拼出來就需要整數倍的小矩形數目。 為了加速演算法,要把m,n中小的那個當做列 分兩個步驟
[BZOJ1435] [ZJOI2009] 多米諾骨牌
題意簡述:求n*m的帶障礙棋盤中,擺放1*2或2*1的多米諾骨牌且相鄰行和相鄰列均存在骨牌跨立的方案數。n,m<=15. 表示校內OJ有毒……n=m=15就完美地因為常數大了一倍而T掉了。。 所以有組特判不要在意……這裡不應該寫插頭的應該寫個狀壓,狀態就能咔嚓掉一半
u3d製作多米諾骨牌小遊戲心得1
1、edit - project settings - time - Time Scale 調整game視窗內的全域性播放速度。 2、AddRelativeForce 將Rigibody的力