상태 dp
#include<stdio.h>
#include<string.h>
#define MAXD 3000
#define MAXM 26000
#define INF 100000000
int N, SUM;
int first[MAXD], next[MAXM], u[MAXM], v[MAXM], flow[MAXM], e;
int s[MAXD], d[MAXD], q[MAXD], work[MAXD];
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
void add(int a, int b, int w)
{
u[e] = a;
v[e] = b;
flow[e] = w;
next[e] = first[a];
first[a] = e;
e ++;
}
int init()
{
int i, j, k, a;
if(scanf("%d", &N) != 1)
return 0;
memset(first, -1, sizeof(first));
e = SUM = 0;
for(i = 1; i <= N; i ++)
for(j = 1; j <= N; j ++)
{
scanf("%d", &a);
SUM += a;
if((i + j) % 2 == 0)
{
add(0, i * N + j, a);
add(i * N + j, 0, 0);
for(k = 0; k < 4; k ++)
{
int x = i + dx[k];
int y = j + dy[k];
if(x >= 1 && x <= N && y >= 1 && y <= N)
{
add(i * N + j, x * N + y, INF);
add(x * N + y, i * N + j, 0);
}
}
}
else
{
add(i * N + j, 1 , a);
add(1, i * N + j, 0);
}
}
return 1;
}
int bfs()
{
int i, j, rear;
memset(d, -1, sizeof(d));
d[0] = 0;
rear = 0;
q[rear ++] = 0;
for(i = 0; i < rear; i ++)
for(j = first[q[i]]; j != -1; j = next[j])
if(d[v[j]] == -1 && flow[j])
{
d[v[j]] = d[q[i]] + 1;
if(v[j] == 1)
return 1;
q[rear ++] = v[j];
}
return 0;
}
int dfs(int cur, int a)
{
if(cur == 1)
return a;
for(int &i = work[cur]; i != -1; i = next[i])
if(flow[i] && d[v[i]] == d[cur] + 1)
if(int t = dfs(v[i], a < flow[i] ? a : flow[i]))
{
flow[i] -= t;
flow[i ^ 1] += t;
return t;
}
return 0;
}
int dinic()
{
int res = 0, t;
while(bfs())
{
memcpy(work, first, sizeof(first));
while(t = dfs(0, INF))
res += t;
}
return res;
}
int main()
{
while(init())
{
int res = dinic();
printf("%d
", SUM - res);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.