讀題:一開始看題感到無從下筆,看到t給出範圍後想到老師說看到引數給範圍便想一想能不能建陣列來解決。而這時認真看一下題,每一秒落在乙個位置x上
不正好可以建乙個陣列 a來儲存嗎;
構思:
由第一組測試資料
6得到a陣列:5 14 1
6 17 2
7 28 3
這樣便可由a用深度優先搜尋來找最大餡餅數——結果很明顯(超時) ٩(๑❛ᴗ❛๑)۶
因為深搜太慢,且題目資料很大;
那麼就只有用dp(動態規劃)來做了
從a出發,時間過去一秒的前提下可以待在原地,可以向左,可以向右。
即在時間為5秒及5秒以前
每一行的第乙個(最後乙個元素)只能由斜下方的元素左移一格(右移一格) 時間過一秒後得到(選擇其中最大的一格加上自己本身)
每行的第二(倒數第二)可以由下方的元素不動或左移一格(左移一格) 時間過一秒後得到 (選擇其中最大的一格加上自己本身)
每行的其他元素可由 其下方的 元素不動 或右下方元素左移或左下方元素右移得到 (選擇其中最大的一格加上自己本身)
到了5秒以後
每一行的第一和最後乙個等於
斜下方的元素左移一格(右移一格) 或下方元素不動 時間過一秒後得到(選擇其中最大的一格加上自己本身)
a[0][t]+=max2(a[0][t-1],a[1][t-1]);
a[10][t]+=max2(a[10][t-1],a[9][t-1]);
其他的與5秒以前的第三種情況一樣,可由 其下方的 元素不動 或右下方元素左移或左下方元素右移得到 (選擇其中最大的一格加上自己本身)
這樣便得到了沒一格的最大餡餅數,在最後一秒的一行中選最大的便可
int max=0;
for(i=0;i<11;i++)if(a[i][maxt]>max)max=a[i][maxt];
完整**如下:
#include#includeint a[11][100005];
int max2(int i,int n)
int max3(int x,int y,int z)
int v=1;
for(i=3;i<=7;i++)
v++;
for(i=2;i<=8;i++)
v++;
for(i=1;i<=9;i++)
v++;
for(i=0;i<=10;i++)
if(mt<=5)
else
int max=0;
for(i=0;i<11;i++)if(a[i][mt]>max)max=a[i][mt];
printf("%d\n",max);
} }}
nyoj613免費餡餅 動態規劃
免費餡餅 設f x t 表示位置x處,第t秒能獲得的最大餅數,則 f x t max f x 1 t 1 f x t 1 f x 1 t 1 f x t 因為位置0無法 1,所以對位置全部做 1的處理 二刷 include include include using namespace std co...
NYOJ 613免費餡餅 動態規劃解法
讀題 一開始看題感到無從下筆,看到t給出範圍後想到老師說看到引數給範圍便想一想能不能建陣列來解決。而這時認真看一下題,每一秒落在乙個位置x上 不正好可以建乙個陣列 a來儲存嗎 構思 由第一組測試資料 6 5 14 1 6 17 2 7 28 3 得到a陣列 這樣便可由a用深度優先搜尋來找最大餡餅數 ...
NYOJ 613免費餡餅
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不 掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameb...