HDU 1176

来源:互联网 发布:sql删除存储过程语句 编辑:程序博客网 时间:2024/06/05 09:46


动态规划题


dp[i][j] = dp[i+1][j-1] + dp[i+1][j] + dp[i+1][j+1];/* **表示第i秒到位置j共取得的馅饼** 采用自底向上求解法,因为每一次选择(左、右、停)都基于下一次怎么走才能取得最大,所以直接逆着推** 举个例子, 不妨假设倒数第二个位置为i就能确定最后的位置( 现 择),然后更新这个倒数第二个位置的馅饼(加上最后位置的馅饼),同理向上走。*/  



嗯.. 就是那个数塔模型!

P.S. 
动态规划题基于动态规划的数塔模型算法


#include <iostream>#include <algorithm>using namespace std;int val[100010][11];int dp[100010][11];int main(){    int n;    while(~scanf("%d",&n),n){        memset(dp,0,sizeof(dp));        memset(val,0,sizeof(val));        int pi,tt,_time=0;        for(int i=0;i<n;i++){            scanf("%d%d",&pi,&tt);            val[tt][pi]++;            if(tt>_time)  _time = tt;        }        for(int i=_time;i>=0;i--){            for(int j=0;j<11;j++){                if(j==0)    dp[i][j]=max(dp[i+1][j+1],dp[i+1][j])+val[i][j];                else if(j==10)  dp[i][j]=max(dp[i+1][j-1],dp[i+1][j])+val[i][j];                else    dp[i][j]=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]))+val[i][j];            }        }        printf("%d\n",dp[0][5]);    }    return 0;}

0 0
原创粉丝点击