[DP] HDU 1176

来源:互联网 发布:如何识别淘宝客链接 编辑:程序博客网 时间:2024/06/03 14:08

题意

0—10的点,不同时间在每个点上掉下来物品,只能到达左右两边距离为1和本身所在的位置,求最大物品数

思路

dp[x][t] = max ( dp[x-1][t-1],dp[x][t-1],dp[x+1][t-1]) + v[x][t]

代码

#include <algorithm>#include <cstdlib>#include <cstring>#include <iostream>#define N 100005#define INF 0x7f7f7f7fusing namespace std;int val[ N ][ 12 ];int dp[ N ][ 12 ];int main () {    int n;    while ( ~scanf ( "%d", &n ) && n ) {        memset ( val, 0, sizeof ( val ) );        memset ( dp, 0, sizeof ( dp ) );        for ( int i = 0; i < 12; ++i )            dp[ 0 ][ i ] = -INF;        dp[ 0 ][ 5 ] = 0;        int t = 0; //记录最后一个馅饼的时间        for ( int i = 0; i < n; ++i ) {            int x, T;            scanf ( "%d%d", &x, &T );            val[ T ][ x ]++;            if ( t < T )                t = T;        }        for ( int i = 1; i <= t; ++i )            for ( int j = 0; j <= 10; ++j ) {                int mx = dp[ i - 1 ][ j ];                if ( j - 1 >= 0 )                    mx = max ( dp[ i - 1 ][ j - 1 ], mx );                if ( j + 1 <= 10 )                    mx = max ( dp[ i - 1 ][ j + 1 ], mx );                dp[ i ][ j ] = mx + val[ i ][ j ];            }        int sol = 0;        for ( int i = 0; i <= 10; ++i )            if ( sol < dp[ t ][ i ] )                sol = dp[ t ][ i ];        printf ( "%d\n", sol );    }    return 0;}
原创粉丝点击