[排序][二分][dp]JZOJ 2747 捡金子
生活随笔
收集整理的這篇文章主要介紹了
[排序][二分][dp]JZOJ 2747 捡金子
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
從前有一個迷宮,迷宮的外形就像一棵帶根樹,每個結(jié)點(除了葉子結(jié)點外)恰好有K個兒子。
一開始你在根結(jié)點,根結(jié)點的K個兒子分別標記為‘A’, ‘B’, ‘C’….,而結(jié)點‘A’的K個兒子結(jié)點分別標記為‘AA’,‘AB’,‘AC’……,依此類推。這棵樹一共有L層。
現(xiàn)在你事先知道M個結(jié)點中有金子,并且你可以派出N個機器人去收集金子。首先你可以分別指定每一個機器人的目標結(jié)點,于是這些機器人就會收集從根結(jié)點到其目標結(jié)點這條路徑上(包括目標結(jié)點)所有的金子,但是每個位置的金子只能被收集一次。
現(xiàn)在你需要制定一個目標的分配方案,使得收集到的金子最多。
題解
首先,我們將m個結(jié)點從小到大排序 那么我們要把樹造出來,其實只用將這幾個用金子的結(jié)點連起來就好了 我們找到2~m的父親(或爺爺或曾爺爺或曾曾爺爺或曾曾曾爺爺.....)(用!!二分!!實現(xiàn)),存入隊列里邊 最后就可以dp了我們設(shè)f[i][j]為以第i個結(jié)點為根,用第j個機器人的收集金子的最大數(shù)狀態(tài)轉(zhuǎn)移方程就是 f[x][i]=max(f[x][i],f[x][i-j]+f[y][j])(Ps: x為當(dāng)前結(jié)點 i為當(dāng)前枚舉到用第i個機器人 y為他下一輩的結(jié)點 j為他下一輩結(jié)點用的機器人)代碼
uses math; type strx=string[55]; var num,m,k,l,n,x,i,j:longint;next,last,first,bz:array[0..50050]of longint;a:array[0..50050]of strx;f:array[0..50050,0..50]of longint;w:string;procedure insert(i,j:longint); begininc(num);next[num]:=last[i];last[i]:=num;first[num]:=j; end;procedure qsort(l,r:longint); var i,j:longint;mid,t:strx; beginif (l>=r) then exit;i:=l; j:=r; mid:=a[(l+r) div 2];repeatwhile (a[i]<mid) do inc(i);while (a[j]>mid) do dec(j);if (i<=j) thenbegint:=a[i]; a[i]:=a[j]; a[j]:=t;inc(i); dec(j);end;until i>j;qsort(l,j);qsort(i,r); end;function find(x:strx):longint; var l,r,mid:longint; beginl:=1; r:=i;while (l<r) dobeginmid:=(l+r)div 2;if (a[mid]<x)then l:=mid+1 else r:=mid;end;if (a[l]<>x) then exit(0) else exit(l); end;procedure dp(x:longint); var k,y,i,j:longint; begink:=last[x];while (k<>0) dobeginy:=first[k];dp(y);for i:=n downto 1 dofor j:=1 to i dof[x,i]:=max(f[x,i],f[y,j]+f[x,i-j]);k:=next[k];end;for i:=1 to n do f[x,i]:=f[x,i]+bz[x]; end;beginreadln(m,k,l,n);for i:=1 to m do readln(a[i]);inc(m);a[m]:='';qsort(1,m);x:=1;for i:=2 to m dobeginw:=a[i];delete(w,length(w),1);j:=find(w);while (j=0) dobegindelete(w,length(w),1);j:=find(w);end;insert(j,i);bz[i]:=1;end;dp(1);writeln(f[1,n]); end.轉(zhuǎn)載于:https://www.cnblogs.com/Comfortable/p/8412245.html
總結(jié)
以上是生活随笔為你收集整理的[排序][二分][dp]JZOJ 2747 捡金子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dom4j操作XML
- 下一篇: python time模块