HDU - 1176 免費餡餅(kuangbin專題十二DP)

不以總結爲目的刷題就是在耍流氓!
 做這個專題的時候,我也一直在思考。如果是隨便拿到一道題,那怎樣才能判斷出是否是DP題?


以我現在的經驗是

  1. 首先思考問題規模能否縮小,像餡餅這個題,設餡餅總共掉了t秒,

代碼

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 100005
using namespace std;
int dp[maxn][15];
int a[maxn][15];
int dir[3] = {-1,0,1};
int main(void)
{
 int n;
 while(scanf("%d",&n)&&n)
 {
  memset(a,0,sizeof(a));
  int x,t;
  int max_time = 0;
  for(int i = 0;i<n;i++)
  {
   scanf("%d%d",&x,&t);
   a[t][x]++;
   max_time = max(max_time,t);;
  }
  memset(dp,0xc0,sizeof(dp));
  dp[0][5] = 0;
  for(int i = 1;i<=max_time;i++)
  {
   for(int j = 0;j<=10;j++)
   {
    for(int k = 0;k<3;k++)
    {
     int loc = j+dir[k];
     if(loc>=0&&loc<=10)
      dp[i][j] = max(dp[i][j],dp[i-1][loc]+a[i][j]); //這裏要想清楚,不能好像是什麼狀態
      //dp[i][j]的含義是,在i秒結束站在j位置,接到的餅數 
    }
   }
  }
  printf("%d\n",*max_element(dp[max_time],dp[max_time]+11)); 
 }
 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章