彙總見
這五個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/while(1);
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個數中的乙個乘上乙個素數得到,這麼做是平方級的,已經接...