HDU 1176免费馅饼

来源:互联网 发布:珠海远光软件 编辑:程序博客网 时间:2024/06/06 00:44

这个题目和最基础的那个金字塔型的那种dp问题很类似。定义状态dp[i][j]:表示在i这个时间在j这个位置可以得到的最大的饼的数目;状态转移方程:   dp[i][j] = user_max(dp[i + 1][j - 1], dp[i + 1][j], dp[i + 1][j + 1]) + arr[i][j];其中user_max是自己写的一个比较三个数中最大的数的函数,arr[i][j]这个数组用来存储在i这个时间点j这个位置饼的数目。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAX = 1e5 + 5;int arr[MAX][15], dp[MAX][15];int user_max(int a, int b, int c){    return max(max(a, b), c);}int main(){    int n;    while (scanf("%d", &n))    {        memset(dp, 0, sizeof(dp));        memset(arr, 0, sizeof(arr));        if (n == 0)            break;        int time, pos, max_time = 0;        for (int i = 1; i <= n; ++i)        {            scanf("%d%d", &pos, &time);            arr[time][pos + 1]++;            max_time = max(time, max_time);        }        for (int i = 1; i <= 12; ++i)            dp[max_time][i] = arr[max_time][i];        /*        for (int i = 1; i <= max_time; ++i)        {            for (int j = 1; j <= 12; ++j)            {                printf("%d ", arr[i][j]);            }            printf("\n");        }        */        for (int i = max_time - 1; i >= 1; --i)        {            for (int j = 1; j <= 12; ++j)            {                dp[i][j] = user_max(dp[i + 1][j - 1], dp[i + 1][j], dp[i + 1][j + 1]) + arr[i][j];            }        }        printf("%d\n", user_max(dp[1][5],dp[1][6], dp[1][7]));    }    return 0;}


0 0
原创粉丝点击