POJ 1185 炮兵阵地(状压DP)题解

思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k][t] + num[j])

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
const int N = 500+5;
const int MOD = 100000000;
const int INF = 0x3f3f3f3f;
using namespace std;
int n,m,top;
int cur[110],state[110],dp[110][110][110],num[110];
void init(){
    top = 0;
    int tot = 1 << m;
    for(int i = 0;i < tot;i++){
        if(i&(i<<1) || i&(i<<2)) continue;
        state[++top] = i;
        for(int j = 0;j < m;j++){
            if(i&1< ans) ans = dp[n][i][j];
        }
    }
    printf("%lld\n",ans);
    return 0;
}

 

你可能感兴趣的:(DP)