当前位置:编程学习 > C/C++ >>

HDU 1176 免费馅饼

思路:据说是DP题(时间dp)

    动态转移:dp[ i ][ j ]+=max(dp[ i+1 ][ j-1 ],dp[ i+1 ][ j ],dp[ i+1 ][ j+1 ]);

[cpp] 
<span style="font-size:18px;"><strong><span style="color:#000099;">#include<iostream> 
#include<cstdio> 
#include<cstring> 
using namespace std; 
#define max(a,b) (a)>(b)?(a):(b) 
#define N 100005 
int dp[N][11]; 
int main() 

   int n,x,t,i,j,maxt; 
   while(scanf("%d",&n)&&n) 
   { 
       memset(dp,0,sizeof(dp)); 
       maxt=0; 
      for(i=1;i<=n;i++) 
      { 
        scanf("%d%d",&x,&t); 
        dp[t][x]++; 
        if(maxt<t) maxt=t; 
      } 
      for(i=maxt;i>=0;i--) 
      { 
          dp[i][0]+=max(dp[i+1][0],dp[i+1][1]);//左边界特殊考虑 
          for(j=1;j<=9;j++) 
              dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]); 
          dp[i][10]+=max(dp[i+1][9],dp[i+1][10]);//右边界特殊考虑 
             
      } 
      printf("%d\n",dp[0][5]); 
   } 
   return 0; 
}</span></strong></span> 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,