不以總結爲目的刷題就是在耍流氓!
做這個專題的時候,我也一直在思考。如果是隨便拿到一道題,那怎樣才能判斷出是否是DP題?
以我現在的經驗是
- 首先思考問題規模能否縮小,像餡餅這個題,設餡餅總共掉了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;
}