杭電ACM 天上掉餡餅(DP)

2021-09-13 23:26:17 字數 1488 閱讀 8847

注意點:

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馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接...