hdu 1176 免费馅饼(nyist 613)

本文详细解析了HDU 1176问题的动态规划解决方案,介绍了dp[i][j]的概念,即第i秒接j位置的馅饼最大值,并通过示例代码展示了如何实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

dp[i][j]:表示第i秒接j位置的馅饼的最大值。

三种状态:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1])+a[i][j]

分别是上一秒接j位置上一秒接j-1位置上一秒接j+1位置

注意数组初始化。

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4. int dp[100005][11],a[100005][11];  
  5. int main(int argc, char *argv[])  
  6. {  
  7.     int n,i,j,id,t,maxt,ans;  
  8.     while(cin>>n&&n)  
  9.     {  
  10.         memset(a,0,sizeof(a));  
  11.         for(maxt=0,i=1;i<=n;i++)  
  12.         {  
  13.             cin>>id>>t;  
  14.             a[t][id]++;  
  15.             if(maxt<t) maxt=t;  
  16.         }  
  17.         for(i=1;i<=maxt;i++)  
  18.         for(j=0;j<=10;j++)  
  19.             dp[i][j]=-1000000005;  
  20.         dp[1][4]=a[1][4]; dp[1][5]=a[1][5]; dp[1][6]=a[1][6];  
  21.         int x1,x2,x3;  
  22.         for(i=2;i<=maxt;i++)  
  23.         for(j=0;j<=10;j++)  
  24.         {  
  25.             x1=dp[i-1][j]+a[i][j];  
  26.             if(j-1>=0) x2=dp[i-1][j-1]+a[i][j]; else x2=-1000000005;  
  27.             if(j+1<=10) x3=dp[i-1][j+1]+a[i][j]; else x3=-1000000005;  
  28.             if(x1<x2) x1=x2;  
  29.             if(x1<x3) x1=x3;  
  30.             dp[i][j]=x1;  
  31.             //cout<<i<<" -> "<<j<<" "<<dp[i][j]<<endl;  
  32.         }  
  33.         for(ans=i=0;i<=10;i++)  
  34.         {  
  35.             if(dp[maxt][i]>ans) ans=dp[maxt][i];  
  36.         }  
  37.         cout<<ans<<endl;  
  38.     }  
  39.     return 0;  
  40. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值