題意:
思路:每一行最多只有10列,所以可以用二進位制來表示每一行的狀態。
d【i】【j】【k】表示第i行狀態為k時,並且上一行狀態為j時的最大炮兵數。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 #include12using
namespace
std;
13 typedef long
long
ll;14 typedef pairpll;
15const
int inf = 0x3f3f3f3f;16
const
int maxn = 20+5;17
18int
n, m;
1920
char s[20
];21
int st[105
];22
int tmp[105
];23
int num[105
];24
int d[105][105][105
];25
26int calc(int
x)27
34return
tmp;35}
3637
intmain()
3851}52
53int top=0;54
for(int i=0;i
/記錄可行狀態
5562}63
64int ans=0
;65 memset(d,-1,sizeof
(d));
66for(int i=0;i//
第一行狀態
6770
71for(int i=2;i<=n;i++)
7290
91 d[i][k][j]=max(d[i][k][j],d[i-1][t][k]+num[j]);92}
93}94}
95}9697
for(int i=0;i)
98for(int j=0;j)
99 ans=max(ans,d[n][i][j]);
100 printf("
%d\n
", ans);
101}
102return0;
103 }
POJ1185(炮兵陣地) 狀壓DP
每一行的狀態是取決於上一行和上上一行的,所以每次更新的時候需要記錄當前行的狀態和下一行的狀態,然後再進行遞推。不過估算了一下複雜度是10的11次方,嚇得我都沒敢寫啊!看了一下別人的部落格,居然真有這樣寫過的,於是就自己實現一邊啦 最後看了以下討論版,處理一下複雜度可以降低的,最後貼討論版 思路 令p...
POJ1185 炮兵陣地 狀壓dp
司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰...
POJ 1185 炮兵陣地 狀壓DP
炮兵陣地 time limit 2000ms memory limit 65536k total submissions 25954 accepted 10004 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地...