serkoi最新推出了一種叫做「免費餡餅」的遊戲:
遊戲在乙個舞台上進行。舞台的寬度為 \(w\) 格,天幕的高度為 \(h\) 格,遊戲者佔一格。
開始時遊戲者站在舞台的正**,手裡拿著乙個托盤。下圖為天幕的高度為 \(4\) 格時某乙個時刻遊戲者接餡餅的情景。
遊戲開始後,從舞台天幕頂端的格仔中不斷出現餡餅並垂直下落。遊戲者左右移動去接餡餅。遊戲者每秒可以向左或向右移動一格或兩格,也可以站在原地不動。
餡餅有很多種,遊戲者事先根據自己的口味,對各種餡餅依次打了分。同時,在 \(3-308\) 電腦的遙控下,各種餡餅下落的速度也是不一樣的,下落速度以格/秒為單位。
當餡餅在某一秒末恰好到達遊戲者所在的格仔中,遊戲者就收集到了這塊餡餅。
寫乙個程式,幫助我們的遊戲者收集餡餅,使得所收集餡餅的分數之和最大。
輸入檔案的第一行是用空格隔開的兩個正整數,分別給出了舞台的寬度 \(w\) ( \(1\) 到 \(99\) 之間的奇數)和高度 \(h\) ( \(1\) 到 \(100\) 之間的整數)。
接下來依餡餅的初始下落時間順序給出了所有餡餅的資訊。每一行給出了一塊餡餅的資訊。由四個正整數組成,分別表示了餡餅的初始下落時刻( \(0\) 到 \(1000\) 秒),水平位置、下落速度( \(1\) 到 \(100\) )以及分值。遊戲開始時刻為 \(0\) 。從 \(1\) 開始自左向右依次對水平方向的每格編號。
輸入檔案中同一行相鄰兩項之間用乙個或多個空格隔開。
輸出檔案的第一行給出了乙個正整數,表示你的程式所收集的最大分數之和。
3 3
0 1 2 5
0 2 1 3
1 2 1 3
1 3 1 4
12
餡餅個數
移動 \(dp\) ,重在移動,但是兩個物體都移動處理起來還是很麻煩的,所以定餡餅不動,讓人動,去接餡餅。
但是要注意的是餡餅在第 \(i\) 秒到第 \(i+1\) 秒的降落過程中,不可被接到,相當於閃現,在過程中不可選中。
所以只有在高度能夠被速度整除的時候,才可以被接到,所以有的餡餅可以除去,不考慮。
設 \(f[i][j]\) 為在第 \(i\) 時刻,小人在第 \(j\) 的座標,能夠接到的最大值。
用 \(k\) 列舉小人移動的距離 \((-2、-1、0、1、2)\) ,動態轉移方程:
\(f[i][j]=min(f[i][j],f[i-1][j+k]+a[i][j])\)
#include using namespace std;
const int maxn=2500+50;
int w,h;
int dp[maxn][maxn];
int maxtime;
int dx[5]=;
struct nodee[maxn];
int cala(int t,int now)
return ans;
}int main()
}if(tot==1)
if(w==1)
}printf("%d\n",sum);
return 0;
}for(int i=1;i<=tot;i++)
for(int i=maxtime-1;i>=0;i--)
}
printf("%d\n",dp[0][w/2+1]);
return 0;
}
免費餡餅 (dp)
都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接...
免費餡餅(DP)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不 掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gamebo...
免費餡餅 (dp)
都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接...