码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1176 免费馅饼

时间:2015-10-06 18:11:46      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176

题意就自己去看看啦= = 我就不说了 毕竟中文题面。

解决思路:动态规划

dp[i][t]含义:在t时刻i点可以接到的馅饼数

转移方程要分三种情况来考虑,一个是在左右两个端点,左端点的时候dp[i][t]+=max(dp[i][t-1],dp[i+1][t-1]) 表示在t时刻i地点可以接到的最大的馅饼数等于在该点应该掉下来的数量加上前一个时刻在这个地点接到的馅饼数量的最大值或者在右边前一个时刻接到的最大的馅饼数量,这两个量取哪一个取决于哪一个大,谁大就从哪里转移过来。

右端点:dp[i][t]+=max(dp[i][t-1],dp[i-1][t-1])

中间:dp[i][t]+=max(dp[i-1][t-1],dp[i][t-1],dp[i+1][t-1])

分析方式和上面是一样的 大家自己理解一下啦。

代码:

/*************************************************************************
    > File Name: 1176.cpp
    > Author: kanberra
    > Mail: kanberra354562007@gmail.com 
    > Created Time: 一 10/ 5 21:23:04 2015
 ************************************************************************/
#include <bits/stdc++.h>
using namespace std;
int dp[11][100005];
int main(){
    //freopen("test.in","r",stdin);
    int m;
    int ca=1;
    while (scanf("%d",&m)==1&&m){
       cout<<"Case "<<ca++<<":"<<endl;
       memset(dp,0,sizeof(dp));
       int x,T;
       int mxT=0,mnT=0;
       for (int i=0;i<m;i++){
           scanf("%d%d",&x,&T);
           dp[x][T]++;
           mxT=max(mxT,T);
           mnT=min(mnT,T);
       }
       int mx=dp[5][mnT];
       for (int t=mnT+1;t<=mxT;t++){
          int pos=5-2*(t-mnT)+1;
          if (pos<0) pos=0;
          for (int i=pos;i<=10&&i<=5+2*(t-mnT)+1;i++){
              if (i==0) dp[i][t]+=max(dp[i][t-1],dp[i+1][t-1]);
              else if (i==10) dp[i][t]+=max(dp[i][t-1],dp[i-1][t-1]);
              else dp[i][t]+=max(dp[i][t-1],max(dp[i-1][t-1],dp[i+1][t-1]));
              mx=max(mx,dp[i][t]);
          }
       }
       printf("%d\n",mx);
    }
    return 0;
}

 

HDU 1176 免费馅饼

标签:

原文地址:http://www.cnblogs.com/kanberra/p/4857363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!