Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3527 Accepted Submission(s): 1219 Problem Description 郑厂长不是正厂长
Input 输入包含多组测试数据;
Output 请为每组数据计算并输出最多能安排的士兵数量,每组数据输出一行。
Sample Input 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sample Output 2
Source
Recommend liuyiding
|
这个的话,其实和炮兵布阵是一样的了,
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int dp[2][200][200] ;
int cannot[101] ;
int N , M ;
int ok(int x){ //同行
if(x & (x<<2))
return 0 ;
if(x & (x>>2))
return 0 ;
return 1 ;
}
int Count(int x){
int sum = 0 ;
while(x){
if(x&1)
sum++ ;
x>>=1 ;
}
return sum ;
}
void get_all_states(vector<int> &states , vector<int> &people){
int i ;
states.clear() ;
people.clear() ;
for(i = 0 ; i < (1<<M) ; i++){
if(ok(i)){
states.push_back(i) ;
people.push_back(Count(i)) ;
}
}
}
int DP(){
int i , j , k ,row , sum = 0 ;
vector<int> states ;
vector<int> people ;
get_all_states(states , people) ;
memset(dp , -1 , sizeof(dp)) ;
for(i = 0 ; i < states.size() ; i++){
if(states[i] & cannot[1])
continue ;
dp[1][i][0] = people[i];
}
for(row = 2 ; row <= N ; row++){
for(i = 0 ; i < states.size() ; i++){
if(states[i] & cannot[row])
continue ;
for(j = 0 ; j < states.size() ; j++){
if(states[j] & cannot[row-1])
continue ;
if(states[i] & (states[j]<<1))
continue ;
if(states[i] & (states[j]>>1))
continue ;
for(k = 0 ; k < states.size() ; k++){
if(states[k] & cannot[row-2])
continue ;
if(states[i] & states[k])
continue ;
if(states[j] & (states[k]<<1))
continue ;
if(states[j] & (states[k]>>1))
continue ;
if(dp[(row-1)&1][j][k] == -1)
continue ;
dp[row&1][i][j] = max(dp[row&1][i][j] ,
dp[(row-1)&1][j][k] + people[i]) ;
}
}
}
}
for(i = 0 ; i < states.size() ; i++)
for(j = 0 ; j < states.size() ; j++)
sum = max(sum , dp[N&1][i][j]) ;
return sum ;
}
int main(){
int i , j , x ;
while(cin>>N>>M){
memset(cannot , 0 , sizeof(cannot)) ;
for(i = 1 ; i <= N ; i++){
for(j = 0 ; j < M ; j++){
cin>>x ;
if(!x)
cannot[i] |= (1<<j) ;
}
}
cout<<DP()<<endl ;
}
return 0 ;
}