題目鏈結
思路摘抄自大佬部落格
按層數來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 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區...