POJ 1185 跑兵陣地 狀態壓縮DP

2021-12-29 21:49:10 字數 2601 閱讀 5506

狀態壓縮dp...很簡單了...一行最多10個...用1代表放炮兵..0代表不放...每行的狀態最多1024種..並且還要合法..這樣一來..一行的狀態最多60種了...

能影響到當前行的只有上兩行..所以用三維的dp...dp[t][x1][x2]....t代表哪一層了...x1代表上一層的狀態..x2代表當前層的狀態...

dp[t][x1][x2]= max ( dp[t-1][y][x1] + cnt[x2]) ...y是t-2層的狀態...cnt是當前層狀態的炮兵數,也就是1的數量...這裡看出約束條件..就是狀態x1,x2,y不能衝突...

program:

[cpp]

#include  

#include  

#include  

#include  

#include  

#include  

#include  

#include  

#define ll long long  

#define oo 1000000007  

using namespace std;    

int n,m,a[105],anum; 

char arc[105][12]; 

int cnt[65],dp[105][65][65]; 

bool ok1(int x)   // 判斷當前狀態是否合法  

x/=2; 

}        

return true; 

} bool ok2(int t,int x)  //判斷當前狀態能否放在當前的圖上  

return true; 

} bool ok3(int y,int x) //判斷狀態y在上,狀態x在下,能否不衝突  

return true; 

} int main() 

} for (i=0;i<=n;i++) gets(arc[i]+1); 

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

for (i=1;i<=anum;i++) 

if (ok2(1,a[i]))  dp[1][0][i]=cnt[i];   

for (t=2;t<=n;t++) 

for (i=0;i<=anum;i++) 

if (ok2(t,a[i])) 

for (j=0;j<=anum;j++) 

if (ok2(t-1,a[j]) && ok3(a[j],a[i])) 

for (x=0;x<=anum;x++) 

if (dp[t][j][i]

dp[t][j][i]=dp[t-1][x][j]+cnt[i]; 

ans=0; 

for (i=0;i<=anum;i++) 

for (j=0;j<=anum;j++) 

if (ans

ans=dp[n][i][j]; 

printf("%d\n",ans); 

}  return 0; 

} #include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define oo 1000000007

using namespace std;  

int n,m,a[105],anum;

char arc[105][12];

int cnt[65],dp[105][65][65];

bool ok1(int x)   // 判斷當前狀態是否合法

x/=2;

}      

return true;

}bool ok2(int t,int x)  //判斷當前狀態能否放在當前的圖上

return true;

}bool ok3(int y,int x) //判斷狀態y在上,狀態x在下,能否不衝突

return true;

}int main()

}for (i=0;i<=n;i++) gets(arc[i]+1);

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

for (i=1;i<=anum;i++)

if (ok2(1,a[i]))  dp[1][0][i]=cnt[i]; 

for (t=2;t<=n;t++)

for (i=0;i<=anum;i++)

if (ok2(t,a[i]))

for (j=0;j<=anum;j++)

if (ok2(t-1,a[j]) && ok3(a[j],a[i]))

for (x=0;x<=anum;x++)

if (dp[t][j][i]

dp[t][j][i]=dp[t-1][x][j]+cnt[i];

ans=0;

for (i=0;i<=anum;i++)

for (j=0;j<=anum;j++)

if (ans

ans=dp[n][i][j];

printf("%d\n",ans);

}return 0;} 

poj1185 炮兵陣地(狀態壓縮)

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

poj 1185炮兵陣地(狀態壓縮)

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

POJ1185 炮兵陣地 狀態壓縮DP

感覺和3254很像,不過這次的間隔變成兩格,當前行的狀態與上兩行的狀態有關。狀態轉移方程 dp k q i max dp k q i dp q j i num k num k 表示狀態k的炮兵數量 dp k q i 表示當前第i行為狀態k上一行的狀態為q的炮兵數量總數。炮兵陣地 time limit...