BZOJ1017: [JSOI2008]魔獸地圖DotR

來源:互聯網
上載者:User

標籤:iostream   ret   time   etc   合成   targe   狀態轉移方程   max   href   

傳送門

設$f[i][j][k]$表示對於第$i$個點,向父節點貢獻$j$個已合成的裝備,花費了$k$的代價,最多獲得的力量值。

單純的$f[i][j][k]$是很難轉移的,主要原因是無法維護和其他兒子的關係。所以對於每個節點再搞一個$g[i][j]$表示當前點的前$i$個兒子花費為$k$可以獲得的最大的力量值。

然後肯定要先更新$g[][]$再以$g[][]$來更新$f[][][]$。

列出$g[i][j]$的狀態轉移方程就是:

$g[cnt][k]=max \{ f[son][tol \times edge_v][j] + g[cnt-1][k-j] \}$

其中$tol$表示當前點總共要合成的裝備。

然後根據$g[i][k]$來更新$f[i][j][k]$:

$f[i][j][k]= max \{ g[cnt_{max}][k]+(tol-j) \times Power_i \} $

然後就能愉快的轉移了。

我看其他人的代碼關於$tol$的枚舉是遞減的從而減少不必要的memset。不是很理解,希望神犇留言告訴我QAQ,不過直接memset也不會逾時。

 

 

 

//BZOJ 1017//by Cydiater//2016.10.26#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <ctime>#include <cmath>#include <cstdlib>#include <cstdio>#include <iomanip>#include <bitset>using namespace std;#define ll long long#define up(i,j,n)for(int i=j;i<=n;i++)#define down(i,j,n)for(int i=j;i>=n;i--)#define cmax(a,b) a=max(a,b)#define cmin(a,b) a=min(a,b)const int MAXN=1e4+5;const int oo=1000000001;inline int read(){char ch=getchar();int x=0,f=1;while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}return x*f;}int N,M,len=0,LINK[MAXN],f[55][105][2005],Power[MAXN],Cost[MAXN],LIM[MAXN],indu[MAXN],g[55][MAXN],ans=0;bool tag[MAXN];struct edge{int y,next,v;}e[MAXN];namespace solution{inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}void init(){memset(indu,0,sizeof(indu));N=read();M=read();up(i,1,N)LIM[i]=oo;up(i,1,N){Power[i]=read();char ch;scanf("%c",&ch);tag[i]=(ch==‘A‘)?1:0;if(tag[i]){int tmp=read();while(tmp--){int y=read(),v=read();insert(i,y,v);indu[y]++;}}else{Cost[i]=read();LIM[i]=read();}}}void TreeDP(int node){if(!tag[node]){cmin(LIM[node],M/Cost[node]);up(i,0,LIM[node])up(j,0,i)f[node][j][i*Cost[node]]=Power[node]*(i-j);}else{LIM[node]=oo;for(int i=LINK[node];i;i=e[i].next){TreeDP(e[i].y);cmin(LIM[node],LIM[e[i].y]/e[i].v);Cost[node]+=e[i].v*Cost[e[i].y];}cmin(LIM[node],M/Cost[node]);up(tol,0,LIM[node]){int cnt=0;memset(g,-10,sizeof(g));g[0][0]=0;for(int i=LINK[node];i;i=e[i].next){cnt++;up(j,0,M)up(k,0,j)cmax(g[cnt][j],g[cnt-1][j-k]+f[e[i].y][e[i].v*tol][k]);}up(j,0,tol)up(k,0,M)cmax(f[node][j][k],g[cnt][k]+(tol-j)*Power[node]);}}}void output(int node){up(j,0,LIM[node])up(k,0,M)cmax(ans,f[node][j][k]);}}int main(){freopen("input.in","r",stdin);using namespace solution;init();memset(f,-10,sizeof(f));up(i,1,N)if(indu[i]==0){TreeDP(i);output(i);}cout<<ans<<endl;return 0;}

BZOJ1017: [JSOI2008]魔獸地圖DotR

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.