記憶化搜尋專題 nkoj3698方塊消除

2021-07-22 04:46:42 字數 1233 閱讀 8764

p3698

方塊消除

時間限制 : 

- ms   空間限制 : 

65536 kb

評測說明 : 時限1000ms

問題描述

有n個帶顏色的方塊排成一排,相同顏色的方塊連成一段同色區域,如下圖所示:

遊戲時,玩家可以任選一段同色區域,將其消去。設消去的這段包含x個相同顏色的方塊,則此次消除操作的得分為x^2。然後右邊的所有方塊會往左邊合攏。

如下圖所示:

第一步將白色一段消除,得分16;

第二步將褐色一段消除,得分9;

第三步將橙色一段消除,得分4;

總分29

你的任務是對於給定的一排方塊,計算消除它們能得到的最大得分。

輸入格式

第一行,乙個整數n

第二行,描述初始狀態的一排方塊,由n個空格間隔的整數表示,每個整數表示一種顏色。整數的範圍在[1,n]

輸出格式

一行,乙個整數,表示最大得分

樣例輸入 1

91 2 2 2 2 3 3 3 1

樣例輸出 129

樣例輸入 2

81 2 2 3 1 3 2 1

樣例輸出 218

提示  1<=n<=200

#include#include#include#include#includeusing namespace std;

int n;

int f[205][205][205];

bool mark[205][205][205];

int a[205];

int dp(int l,int r,int k){

if(l>r)return 0;

if(mark[l][r][k])return f[l][r][k];

mark[l][r][k]=true;

if(l==r)return f[l][r][k]=(1+k)*(1+k);

int i,j,p=r,q;

while(a[p]==a[r])p--;

p++;

f[l][r][k]=max(f[l][r][k],dp(l,p-1,0)+(r-p+1+k)*(r-p+1+k));

for(q=l;q>n;

for(i=1;i<=n;i++)cin>>a[i];

for(i=0;i<=n;i++)f[i][i][0]=1;

cout<

記憶化搜尋專題 nkoj3748玩具取名

p3748 玩具取名 時間限制 ms 空間限制 65536 kb 評測說明 時限1000ms 問題描述 某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充...

記憶化搜尋專題

0.前言 有些時候樸素深蒐會出現超時情況,所以誕生出一種記憶化搜尋的dfs,其實它也是dfs,只不過在dfs的過程中,新增了賦值的過程,這個賦值的過程就叫做記憶。這裡面會根據一些題目來講解記憶化搜尋。1.樣例分析 1.1 題目 絡谷 p1434滑雪 1.2分析 1.3 include using n...

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...