POJ-1185 포병 진지 동적 기획 + 상태 압축
12555 단어 동적 기획
코드는 다음과 같습니다.
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
/*
: , , , 2 ,
, .
: , , ,
10, .
. dp[k][i][j]
k i, i-1 j . :
dp[k][i][j] = sum(dp[k-1][j][k]) k i
*/
int N, M, sta[65], idx; // M=10 , 65
int G[105], dp[105][65][65]; // dp ,
void display(int x) {
for (int i = 0; i < M; ++i) {
if (x & (1 << i)) {
printf("1 ");
} else printf("0 ");
}
puts("");
getchar();
}
void dfs(int pos, int statu, int dist) {
if (pos == M) {
sta[++idx] = statu;
// display(statu);
return;
}
dfs(pos+1, statu<<1, dist+1);
if (dist >= 2) {
dfs(pos+1, statu<<1|1, 0);
}
}
bool legal(int x, int y) {
return (x & y) == x; // x 'P'
}
bool judge(int x, int y) {
return !(x & y); // 1
}
int get(int x) {
int ret = 0;
for (int i = 0; i < M; ++i) {
if (x & (1 << i)) {
++ret;
}
}
return ret;
}
int DP() {
int ret = 0;
memset(dp, 0, sizeof (dp));
if (N == 1) { // ,
for (int i = 1; i <= idx; ++i) {
if (legal(sta[i], G[1])) {
ret = max(ret, get(sta[i]));
}
}
return ret;
}
// ,
for (int i = 1; i <= idx; ++i) { //
for (int j = 1; j <= idx; ++j) { //
if (legal(sta[i], G[2]) && legal(sta[j], G[1]) && judge(sta[i], sta[j])) {
dp[2][i][j] = get(sta[i]) + get(sta[j]);
}
}
}
for (int k = 3; k <= N; ++k) {
for (int i = 1; i <= idx; ++i) {
for (int j = 1; j <= idx; ++j) {
if (!judge(sta[i], sta[j]) || !legal(sta[i], G[k]) || !legal(sta[j], G[k-1])) {
continue;
}
for (int m = 1; m <= idx; ++m) {
if (judge(sta[i], sta[m]) && judge(sta[j], sta[m])) {
dp[k][i][j] = max(dp[k][i][j], dp[k-1][j][m]);
}
}
dp[k][i][j] += get(sta[i]);
}
}
}
for (int i = 1; i <= idx; ++i) {
for (int j = 1; j <= idx; ++j) {
ret = max(ret, dp[N][i][j]);
}
}
return ret;
}
int main() {
char str[15];
while (scanf("%d %d", &N, &M) == 2) {
idx = 0, dfs(0, 0, 2);
// printf("idx = %d
", idx);
memset(G, 0, sizeof (G));
for (int i = 1; i <= N; ++i) {
scanf("%s", str);
for (int j = 0; j < M; ++j) {
G[i] <<= 1, G[i] |= str[j] == 'P'; // P
}
}
printf("%d
", DP());
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
01 가방, 완전 가방, 다중 가방 dp(동적 기획 입문 dp)01 가방은 2진법으로 직접 표시할 수 있지만 데이터 양이 너무 많으면 시간을 초과하는 것이 폭력이다.01 가방의 사상은 바로 이 물품에 대해 내가 넣은 가치가 큰지 안 넣은 가치가 큰지 비교하여 방정식 f[i][v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.