poj 1192 최 적 화 된 연결 부분 집합
1564 단어 poj
그런대로 잘 만 들 었 어, 나무 모양 dp.
/**
* Problem:POJ1192
* Author:Shun Yao
* Time:2013.5.20
* Result:Accepted
* Memo:DP
*/
#include <cstring>
#include <cstdlib>
#include <cstdio>
long abs(long x) {
return x < 0 ? -x : x;
}
const long Maxn = 1005;
long n, ans, now, f[Maxn];
char visited[Maxn];
class pnode {
public:
long x, y, c;
pnode() {}
~pnode() {}
} p[Maxn];
class gnode {
public:
long v;
gnode *next;
gnode() {}
~gnode() {}
gnode(long V, gnode *ne):v(V), next(ne) {}
} *g[Maxn];
void add(long x, long y) {
g[x] = new gnode(y, g[x]);
g[y] = new gnode(x, g[y]);
}
void DP(long x) {
visited[x] = 1;
f[x] = p[x].c;
for (gnode *e = g[x]; e; e = e->next) {
if (!visited[e->v]) {
DP(e->v);
if (f[e->v] > 0)
f[x] += f[e->v];
}
}
if (now < f[x])
now = f[x];
}
int main() {
static long i, j;
freopen("poj1192.in", "r", stdin);
freopen("poj1192.out", "w", stdout);
scanf("%ld", &n);
for (i = 1; i <= n; ++i) {
g[i] = 0;
scanf("%ld%ld%ld", &p[i].x, &p[i].y, &p[i].c);
for (j = 1; j < i; ++j)
if (abs(p[i].x - p[j].x) + abs(p[i].y - p[j].y) == 1)
add(i, j);
}
memset(visited, 0, sizeof visited);
for (i = 1; i <= n; ++i)
if (!visited[i]) {
now = 0;
DP(i);
ans += now;
}
printf("%ld", ans);
fclose(stdin);
fclose(stdout);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
POJ3071: Football(확률 DP)Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. After n rounds, only one team...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.