您的位置:首页 > 其它

HDU 4293 Groups [DP]

2012-09-20 07:34 405 查看
  又是POJ原题,这网赛是有多少原题。。一些人站队,但有的一排站了多个人,每个人告诉你他前面有多少个人,后面有多少个人,问说实话的人最多有多少个。

  比赛的时候没想法,大叔过的这一题。赛后看了解题报告才发现思想原来是那么简单。p[i][j]表示说前面i个人,后面j个人这个区间说实话的最大人数,有一个人说i,j就加一,注意不能超过n-i-j,然后d[i]表示i前面区间都已经确定时说实话的最大人数。d[i]=max(d[j]+p[j][n-i])。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 505
int n,tu,tv,p[MAXN][MAXN], d[MAXN];
int main() {
while (scanf("%d",&n) != EOF) {
memset(p, 0, sizeof p);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &tu, &tv);
if (tu + tv >= n) continue;
p[tu][tv]  = std::min(p[tu][tv] + 1, n - tu - tv);
}
memset(d, 0, sizeof d);
for (int i = 1; i <= n; i++)
for (int j = 0; j < i; j++)
d[i] = std::max(d[i], d[j] + p[j][n - i]);
printf("%d\n", d
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: