消木塊 模型 設計消除後效性

2022-02-15 23:28:34 字數 1488 閱讀 5805

你們中的一些人可能玩過乙個叫做消木塊的遊戲。

n個木塊排成一列,每個木塊都有乙個顏色。

例如下圖中木塊的顏色分別為:金,銀,銀,銀,銀,銅,銅,銅,金。

每次,你都可以點選乙個木塊,這樣被點選的木塊以及和它相鄰並且同色的木塊就會消除。

如果一次性消除了k個木塊,那麼就會得到k*k分。

例如下圖所示,點選銀色木塊,四個木塊被消去,得到16分。

給定你乙個遊戲初始狀態,請你求出最高得分是多少。

第一行包含整數t,表示共有t組測試資料。

每組資料第一行包含整數n,表示共有n個木塊。

第二行包含n個整數,表示n個木塊的顏色。

代表木塊顏色的整數範圍是1~n。

每組資料輸出乙個結果,每個結果佔一行。

輸出格式為「case x: y」,其中x為資料組別編號,從1開始,y為結果。

1≤n≤200
2

91 2 2 2 2 3 3 3 1

11

case 1: 29

case 2: 1

題解

如果是普通的區間dp,那麼f[left][right]就完事了

可惜這道題不是,如果用普通的一維區間dp,是狀態轉移有問題的

因為你拼接的時候,可以有多種方式

所以因改為 f[left][right][t] 表示 right ~ right + t, a[i] == a[right] (顏色相等)

則轉移分三種

`.left ~ right 顏色都一樣 則 f[l][r] = sqr(r - l ~ 1)

2.否則列舉 left ~ k (k < right - 1), 且 a[p] = a[k + 1] && a[p + 1] != a[k + 1]

就是先列舉出 拼接點 k 和 k + 1, 然後從 k 向 left 消方塊直到存在乙個方塊可以和(k+1)削去, 即列舉每個和(k+1)顏色相同區間的右端點,去轉移

3.不列舉p了,直接消除 (k+1)所在區間(顏色相同)轉移

**如下

#include #define rep(i,a,b) for(int i=a;i<=b;++i)

#define per(i,a,b) for(int i=a;i>=b;--i)

#define sqr(n) (n)*(n)

using namespace std;

const int maxn = 205;

int _, n, m;

int a[maxn], f[maxn][maxn][maxn];

int dp(int i, int j, int k)

int main()

return 0;

}

消除類遊戲之 三消遊戲

1.瓦片地圖 2.array 3.遊戲架構 1選中 2 交換位置 3消除 所以肯定會用到 virtual bool cctouchbegan cctouch touch,ccevent event virtual void cctouchmoved cctouch touch,ccevent eve...

用設計模式消除大量if else

先來看張經典的啊都給神圖,感受下大量if else的 魅力 有時候業務上的拖拉可能要求我去寫出如上的多層if else巢狀 如果你碰上了乙個對團隊成員要求相對比較嚴格的主管的話,那麼恭喜你,死定了 脾氣比較爆的大佬可能直接就跟你說要麼解決上面問題,要麼收拾包袱滾蛋了。public class cof...

按鍵消抖電路設計

用verilog實現按鍵抖動消除電路,抖動小於15ms,輸入時鐘 12mhz 設計思路 使用計數器,計算按鍵時間,如果大於15ms,則認為是有效訊號,若小於15ms,則認為是無效訊號 12mhz 1 clk 83ns 15ms 83ns 180722 0x2c1f2 module rebounce ...