題意:給出矩陣,尋找簡單路徑使之與路徑最小。 N=100,M=8。
如果隊伍都是正數(shù)的話,列舉起點、終點、運行成本的流程就可以了,但是節(jié)約的話一定會給這部分得分。
考慮括號排列的插頭DP,添加3號表示起點和終點的插頭。 請注意,此1是左括號,2是右括號,3是其他這個很有講究,很容易用xor轉(zhuǎn)換。
因為分類討論很復雜,所以參考了claris的來完全寫了。 但是,在細微的處理上必須注意與電路的不同。 還有就是注意括號的端點和插頭3的變換。 我只覺得應該這么做,但其本質(zhì)還不太理解。
# include iostream # include algorithm # include cstdio # include cstring # define rep (I,a,b ) for(intI=a; i=b; I ) #定義ERP (I,a,b ) for ) intI=a; i=b; -I ) #定義獲取位(x,y ) ) (x ) ) (y ) ) (x ) ) ) (y ) ) )1) )定義獲取位(x,y ) ) 652持續(xù)插入voidGmax(inta,int b ) { ab? a=b:0; (}int N,m,ans; int a[105][10]; 結(jié)構(gòu)節(jié)點{ int s,nxt,val; (; 結(jié)構(gòu)散列{ node e [ maxs ]; int adj[mo],ec; void init () memset ) adj,-1,sizeof adj ); ec=0; }voidpush(ints,int v ) {int ha=s%mo; for(intI=adj[ha]; ~i; I=e[I].nxt(if ) e[I].s==s ) returngmax ) e[I].val,v ); e[ec].val=v,e[ec].s=s; e[ec].nxt=adj[ha]; adj[ha]=ec; }} dp[2]; inlineintfindl(intST,int x ) {int cnt=1,s; ERP(I,x-1,0 ) s=) ST(I1 ) ) 3; if(s==2) cnt; ELSEif(s==1) cnt--; if (! cnt )返回I; }返回- 1; }inlineintfindr(intST,int x ) {int cnt=1,s; rep(I,x 1,m ) ) s=) ST(I1 ) ) 3; if(s==1) cnt; ELSEif(s==2) cnt--; if (! cnt )返回I; }返回- 1; }voidwork(intI,int j,int cur ) {dp[cur].init ); REP(k,0,dp[cur^1].ec-1 ) {int lass=dp[cur^1].e[k].s; if(lass=(1) m1 )1) ) ) continue; intl=獲取位(lass,j-1 ); intu=getbit(lass,j ); ints=clrbit(lass,j-1,j ),w=a[i][j]; LL las=dp[cur^1].e[k].val; if (! l! u ) DP[cur].push(s,las ); DP[cur].push(s| bit(2(1,j-1 )|bit ) 2,j ),las w ); DP[cur].push(s|bit ) 3,j-1 ),las w ); DP[cur].push(s|bit ) 3,j ),las w ); }else if (! L ||! u () {int t=L U; DP[cur].push(s|bit ) t,j-1 ),las w ); DP[cur].push(s|bit(t,j ),las w ); if(t==3) if (! s ) gmax(ans,las w ); }else{if(l==1) DP[cur].push ) s^bit ) l,F(xiàn)indR(s ) s,j-1 ) ),las w ); if(l==2) DP[cur].push ) s^bit ) l,F(xiàn)indL(s ) s,j-1 ),las w ); if(u==1) DP[cur].push ) s^bit ) u,F(xiàn)indR(s ) s,j ),las w ); if(u==2) DP[cur].push ) s^bit ) u,F(xiàn)indL(s ) s,j ),las w ); }elseif(L==1u==1) DP[cur].push ) s^bit ) 3,F(xiàn)indR(s ) s,j ) ),las w ); ELSEif(L==2u==1) DP[cur].push(s,las w ); elseif(L==2u==2) DP[cur].push ) s^bit ) 3,findl(s,j-1 ) ),las w ); elseif(L==3u==3) ) if (! s ) gmax(ans,las w ); }elseif(L==3) if ) u==1) DP[cur].push ) s^bit ) u,F(xiàn)indR(s ) s,j ) ),las w ); elseDP[cur].push(s^bit(u,F(xiàn)indL(s ) s,j ) ),las w ); }elseif(u==3) if ) l==1) DP[cur].push ) s^bit ) l,F(xiàn)indR(s ) s,j-1 ) ),las w ); ELSEDP[cur].push(s^bit(l,F(xiàn)indL(s ) s,j-1 ),las w ); }}}int solve () {dp[0].init ),DP[0].push ),0 ); int cur=0; rep(I,1,n ) ) rep ) k,0,dp[cur].ec-1 ) dp[cur].e[k].s=2; REP(j,1,m ) {cur ^=1; 工作(I,j,cur ); } }返回Ans; (}int main ) ) Scanf('%d%d ),n,m ); REP(I,1,n ) rep ) j,1,m ) scanf('%d ',a[i][j] ),gmax ) ans,a[i][j]; printf(%d(n ),求解); 返回0; }