USACO月賽題解 第三十講 動態規劃 一

2021-06-20 09:06:42 字數 1556 閱讀 8429

彙總見

這五個dp題還是很不錯的

第6題,方形牛棚 bigbrn

很經典的題目了,沒有看題解,自己想了個解法

首先m較小的話可以參考另一篇部落格,把點看成邊界來做

這道題dp比較好一些

d[i][j]=min(d[i-1][j-1]+1,min( lft[i][j],up[i][j] ) );

lft和up分別表示左方和上方的空間,都能在平方級時間算出

d[i][j]表示以(i,j)為右下角頂點的邊長最大值

因此整個演算法是平方級的

void setio(string name)

const int maxn=1010;

int d[maxn][maxn],lft[maxn][maxn],up[maxn][maxn],a[maxn][maxn],n,m;

int main()

clr(lft,0);clr(up,0);

rep1(i,n)lft[i][1]=a[i][1]==1?-1:0;

rep1(i,n)for(j,2,n)

rep1(j,n)lft[1][j]=a[1][j]==1?-1:0;

for(i,2,n)rep1(j,n)

clr(d,0);

int ans=0;

rep1(i,n)rep1(j,n)

/*rep1(i,n)pn;

rep1(i,n)pn;

rep1(i,n)*/

writeln(ans+1);

//system("pause");

return 0;

}

第8題 滑雪比賽 bobsled

這題明顯是貪心,分類到dp應該是因為用到遞推的關係。兩個轉彎點之間必然是這樣的策略:不停加速,直到另乙個轉彎點「剎不住」,這樣就能列出不等式,解出這個區間的最大速度,同時更新下乙個轉彎點的速度(因為可能不停加速不用剎車).這樣就能遞推+計算答案了。

但這樣做有漏洞:假如兩個轉彎點之間的距離為1,前乙個限速10,後乙個限速1,顯然第乙個點速度只能到2.所以要計算乙個彎角的「真限速」,計算方法不難,列舉這個點後面的所有彎角,將這些彎角的限速加上兩個彎角之間的距離就行了。什麼?這樣是平方級的?平方演算法有大量重複計算,完全可以變成線性的。

/*

40分 沒考慮剎不住的問題

120分 三個小資料不對

仔細一看,終點速度沒有算

還是錯乙個點

大資料出錯,inf太小

*/ const ll inf = (ll)1<<50;

struct node;

int cmp(node a, node b)

void setio(string name)

node a[100010];

ll d[100010],m[100010],n,l;

int main()

ans = max(ans, d[n] + l - a[n].t);

cout

return 0;

}

USACO月賽題解 第三講 排序

彙總見 這一部分的題目也很經典 第10題 重排乾草 restack 這種題要麼0分要麼滿分,和 訓練指南 的第一章例3幾乎一樣,通過代數分析將題目轉化 最後變成求中位數的題目,o n 還是o nlogn 隨意 bzoj裡出現了兩道和這題幾乎一樣的題目 錯了兩個點 修改資料型別 還是錯這兩個點 發現輸...

USACO月賽題解 第四講 貪心

彙總見 這一部分的題目也很經典,雖然是一次排序解決問題,但有難度 第15題 奶牛雜技 acrobat 這種題基本上要按某種關鍵字排序,所以考慮相鄰兩頭牛,他們上面的牛重量加起來是w0,若a在b上面,a受到壓力為w0 sa b受到壓力為 w0 wa sb.再寫出反過來的情況,進行一下分析即可,最後是按...

USACO月賽題解 第四講 數值計算

彙總見 感覺這部分usaco的題型和oi題還是不大一樣的,做下來意思不大 第3題,醜數 humble 這題還是很經典的,training裡也有。有兩個樸素想法,乙個是造一堆數然後排序,另乙個是已知前k個數推出第k 1個數的方法,第k 1個數由前k個數中的乙個乘上乙個素數得到,這麼做是平方級的,已經接...