注意點:
time=1:活動範圍為4-6;
time=2:3-7;
time=3:2-8;
time=4:1-9;
time=5:0-10(全範圍)
突破口:
狀態:dp[i,j]在i秒,j位置能獲得的最大餅數
狀態轉移方程:
dp[i,j]=max(dp[i-1,j],dp[i-1,j-1],dp[i-1,j+1]);
此題涉及到一些**技巧,要多注意。
**如下:
#include#include#includeusing namespace std;
int dp[100001][11],a[11]; //a[i]為輔助陣列,記錄某一時刻,i位置餅的數量
struct bing
b[100001];
bool cmp(bing x,bing y) //按掉落時間從小到大排序
}//printf("%d %d\n",dp[time][5],dp[0][5]);
if(step==1)
for(j=4;j<=6;j++)
dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1]))+a[j];
else if(step==2)
for(j=3;j<=7;j++)
dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1]))+a[j];
else if(step==3)
for(j=2;j<=8;j++)
dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1]))+a[j];
else if(step==4)
for(j=1;j<=9;j++)
dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1]))+a[j];
else
for(j=0;j<=10;j++)
if(j==0)
dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[j];
else if(j==10)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[j];
else dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1]))+a[j];
// printf("%d %d\n",dp[time][5],dp[0][5]);
} for(i=0;i<=10;i++)
if(dp[time][i]>=ans)
ans=dp[time][i];
printf("%d\n",ans);
} return 0;
}
補充:其實這道題也可以像數塔一樣做,後面有空試著a一下。 免費餡餅(天上掉餡餅)
都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接...
動態規劃 天上掉餡餅
時間限制 1 sec 記憶體限制 64 mb 提交 32 解決 22 提交 狀態 討論版 命題人 題目描述 眾學生一臉不信 老師你不是又在騙我吧,天上怎麼會掉餡餅呢?墨老師滿頭大汗 我這次說得絕對是真的,其實只要你們信,天上也是會掉餡餅的。如圖所示,假設在接下來的一段時間裡,所有的餡餅都掉落在0 1...
ACM題解 動態規劃專題 G天上掉餡餅
都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接...