hdu1176 免费馅饼

来源:互联网 发布:电视apk软件下载 编辑:程序博客网 时间:2024/05/10 11:53

类似与 数塔问题

dp[j][i] 表示 第j个位置,i秒的接的最多饼数。

但是在 j = 0 只能从1 到达,所以有两种选择 dp[j][i - 1] += max ( dp[j + 1][i], dp[j][i] )

j = 10 只能从9 到达 有两种选择 dp[j][i - 1] += max ( dp[j - 1][i], dp[j][i] )

j =1 ~ 9 有三种选择dp[j][i - 1] += max ( dp[j][i], dp[j - 1][i], dp[j + 1][i] )

输出dp[5][0] 即可



#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int dp[11][100001];int maxx ( int a, int b, int c ) {    return max ( max ( a, b ), max ( b, c ) );}int main ( ) {    int n, i, j, x, t;    while ( scanf ( "%d", &n ) != EOF && n ) {        memset ( dp, 0, sizeof ( dp ) );        int Max = 0;        for ( i = 1; i <= n; ++i ) {            scanf ( "%d%d", &x, &t );                                                                                                                       dp[x][t]++;            Max = max ( Max, t );        }        for ( i = Max; i >= 1; --i ) {            for ( j = 0; j <= 10; ++j ) {                if ( j == 0 ) dp[j][i - 1] += max ( dp[j + 1][i], dp[j][i] );                else if ( j == 10 ) dp[j][i - 1] += max ( dp[j][i], dp[j - 1][i] );                else {                    dp[j][i - 1] += maxx ( dp[j][i], dp[j - 1][i], dp[j + 1][i] );                }            }        }        printf ( "%d\n", dp[5][0] );    }}


原创粉丝点击