日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3335-[ZJOI2013]蚂蚁寻路【dp】

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3335-[ZJOI2013]蚂蚁寻路【dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P3335


題目大意

給出n×mn\times mn×m的網格,每個格子有權值。一個回路在格子的邊上,要求有2×k2\times k2×k次左轉,其他都是右轉,且最后222次一定得是右轉。

求包含的格子權值和最大。

1≤n,m≤100,0≤k≤101\leq n,m\leq 100,0\leq k\leq 101n,m100,0k10


解題思路

看起來很像插頭dpdpdp對吧,但是因為最后兩下得是右轉所以不是插頭dpdpdp

畫一下不難發現包圍出來的圖形的底部一定是平的,然后上面是一個凹凸的形狀。且會有k+1k+1k+1個凸,kkk個凹。也就是將固定的底部劃分成2×k+12\times k+12×k+1個凹凸相間的矩形。

先枚舉一個底部,然后考慮dpdpdp。設fj,p,hf_{j,p,h}fj,p,h?表示現在到第jjj列,第ppp個正方形,高度為hhh時的最大權值。

轉移的時候根據ppp的奇偶性決定是在上還是在下,當然也可以直接延長這個矩形。

做個前綴和優化就是O(n2mk)O(n^2mk)O(n2mk)的了


code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=110; int n,m,k,a[N][N],s[N][N],f[N][30][N],g[N][30][N][2],ans; int main() {scanf("%d%d%d",&n,&m,&k);k=k*2+1; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);s[i][j]=s[i-1][j]+a[i][j];}for(int p=1;p<=k;p++)for(int h=1;h<=n;h++)f[0][p][h]=g[0][p][h][0]=g[0][p][h][1]=-1e9;ans=-1e9; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){for(int p=1;p<=k;p++){for(int h=1;h<=i;h++)f[j][p][h]=max(f[j-1][p][h],g[j-1][p-1][h][p&1])+s[i][j]-s[i-h][j];g[j][p][1][1]=g[j][p][i][0]=-1e9;for(int h=i-1;h>=1;h--)g[j][p][h][0]=max(g[j][p][h+1][0],f[j][p][h+1]);for(int h=2;h<=i;h++)g[j][p][h][1]=max(g[j][p][h-1][1],f[j][p][h-1]);}for(int h=1;h<=i;h++)ans=max(ans,f[j][k][h]);}printf("%d\n",ans); return 0; }

總結

以上是生活随笔為你收集整理的P3335-[ZJOI2013]蚂蚁寻路【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。