又是POJ原题,这网赛是有多少原题。。一些人站队,但有的一排站了多个人,每个人告诉你他前面有多少个人,后面有多少个人,问说实话的人最多有多少个。
比赛的时候没想法,大叔过的这一题。赛后看了解题报告才发现思想原来是那么简单。p[i][j]表示说前面i个人,后面j个人这个区间说实话的最大人数,有一个人说i,j就加一,注意不能超过n-i-j,然后d[i]表示i前面区间都已经确定时说实话的最大人数。d[i]=max(d[j]+p[j][n-i])。
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #define MAXN 505 5 int n,tu,tv,p[MAXN][MAXN], d[MAXN]; 6 int main() { 7 while (scanf("%d",&n) != EOF) { 8 memset(p, 0, sizeof p); 9 for (int i = 1; i <= n; i++) { 10 scanf("%d%d", &tu, &tv); 11 if (tu + tv >= n) continue; 12 p[tu][tv] = std::min(p[tu][tv] + 1, n - tu - tv); 13 } 14 memset(d, 0, sizeof d); 15 for (int i = 1; i <= n; i++) 16 for (int j = 0; j < i; j++) 17 d[i] = std::max(d[i], d[j] + p[j][n - i]); 18 printf("%d\n", d[n]); 19 } 20 return 0; 21 }