hdu1176 免费馅饼 ——DP

May 25, 2013
Hdu DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 题目大意:   中文题…… 题目思路:   类似于 Triangle 。d[i][j] 表示 i 时间在 j 位置的所得到的价值。然后就像 Triangle 一样从下往上递推。最终求在0秒的时候,在5位置上的值。 WA了两次,当初求的是0秒的时候,所有位置上的最大值,,这显然是不对的。因为起始位置是5啊。


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 100000+10;
int a[MAX][11], d[MAX][11];
void init() {
  int m, i, j, x, t, tMax = -1;
  while (~scanf("%d", &m) && m) {
  memset(a, 0, sizeof(a));
  memset(d, 0, sizeof(d));
    for (i = 0; i < m; ++i) {
      scanf("%d%d", &x, &t);
      if (tMax < t) tMax = t;
      a[t][x]++;
    }
    for (i = 0; i <= 10; ++i) d[tMax][i] = a[tMax][i];
    for (i = tMax-1; i>= 0; --i) {
      for (j = 0; j <= 10; ++j) {
        if (j == 0) {
          d[i][j] = max(d[i+1][j], d[i+1][j+1]) + a[i][j];
          continue;
        } 
        else if (j == 10) {
          d[i][j] = max(d[i+1][j], d[i+1][j-1]) + a[i][j];
          continue;
        }
        d[i][j]=max(d[i+1][j], max(d[i+1][j+1], d[i+1][j-1]))+a[i][j];
      }
    }
    printf("%d\n", d[0][5]);
  }
}
int main(void) {
  init();
  return 0;
}

很多题目都是相通的

comments powered by Disqus