題解 poj1185 狀壓DP

2021-08-22 19:43:32 字數 1148 閱讀 4460

題目鏈結

思路摘抄自大佬部落格

按層數來dp,如果用 dp[i][j][k] 來表示在第 i 行,狀態為 j ,i-1行狀態為 k 時的狀態,那麼有轉移方程

dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][l] + num[i]);

列舉 i(層數),j(當前層狀態),k(上一層狀態),l(上上層狀態)就可以來進行轉移了。

#include

#include

#include

#include

using

namespace

std;

int n,m;

int maze[105];//地圖

int dp[2][65][65];//滾動陣列

int num[65];//多少個1

int sta[65];//狀態

int ns;//狀態數

int getnum(int x)//獲取x狀態有多少個1

void init()//預處理出最極限狀態下可能用到的狀態

}}int main(void)

memset(maze,0,sizeof(maze));

memset(dp,0,sizeof(dp));

for(int i=0;ifor(int j=0;jchar ch;

cin>>ch;

if(ch=='h')

maze[i]=maze[i]|(1

}int now=0;//滾動陣列標記初始為0

int res=0;

for(int i=0;iif(sta[i]>=(1

if(!(maze[0]&sta[i]))//如果第0行和sta[i]狀態相&為0,則可以處理dp[now][i][0]

}if(n==1)

now^=1;//更改標記

for(int i=0;i//列舉狀態預處理第2層

}now^=1;//更改標記

if(n==2)

for(int l=2;l//列舉層數l,當前狀態i,上一層狀態j,上上層狀態k }}

now^=1;

}printf("%d\n",res);

}return

0;}

POJ 1185 經典狀壓dp

做了很久的題 有注釋 include include include include includeusing namespace std int dp 107 107 107 二維記錄上一次 三維記錄此次 dp i k j max dp i k j dp i 1 t k num j t為列舉數且滿...

POJ 1185 經典狀壓dp (模板)

炮兵陣地 time limit 2000ms memory limit 65536k total submissions 26096 accepted 10072 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地...

poj1185 三維狀壓dp

description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區...