bzoj3111 [Zjoi2013]螞蟻尋路


zjoi2013的題終於做完了,拖了好久,覺得這份題質量挺高的,而且代碼量都不是很大,zj的題還是比較注重思路的,而且都可以有不同的解法,甚至可以騙分= =。

這個題我一開始只能想出N^4的,后來參考某神的題解發現我多出來的那一維完全是沒有用的......但是我還是想總結一下思路,畢竟這種2D的DP做的比較少,以免以后忘掉。

首先經過一些列的簡化我們發現這個題實際就是求個凹凸不平的形狀中的最大值,也就是一堆高度參差不齊的子矩形的和,這些子矩陣同底,高滿足一高一低,一共要這樣變2k次,也就是一共有2*k+1個矩形。

設f[i][j][k][h]表示以[i][j]為右下角的子矩陣,是當前的第k個子矩陣,最高點的坐標是h的最大和,然后mx[i][j][k][h][0/1]表示···最高點坐標不大於/不小於h的最大和。

於是有以下轉移:

  f[i][j][k][h]=max{  f[i][j-1][k][h] , mx[i][j-2][k-1][h][k%2]  }+s[i][j]-s[h-1][j]

  mx[i][j][k][h][0]=max{  mx[i][j][k][h-1][0] , f[i][j][k][h-1]  }

  mx[i][j][k][h][1]=max{  mx[i][j][k][h+1][1] , f[i][j][k][h+1]  }

  ans 用max{  f[j][p][i] , mx[j][p][i][0]  }來更新

注意邊界條件f[0][k][i]=mx[0][k][i][0]=mx[0][k][i][1]=-inf;

ant
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #define maxn 120
 7 #define inf 1000000000
 8 using namespace std;
 9 int f[maxn][24][maxn],a[maxn][maxn],s[maxn][maxn],mx[maxn][24][maxn][3];
10 int n,m,p,ans;
11 
12 int main()
13 {
14     scanf("%d%d%d",&n,&m,&p);
15     p=p*2+1;
16     for (int i=1;i<=n;i++)
17         for (int j=1;j<=m;j++)
18             scanf("%d",&a[i][j]),s[i][j]=s[i-1][j]+a[i][j];
19     for (int i=1;i<=n;i++)
20         for (int k=1;k<=p;k++)
21             f[0][k][i]=mx[0][k][i][0]=mx[0][k][i][1]=-inf;
22     ans=-inf;
23     for (int i=1;i<=n;i++)
24         for (int j=1;j<=m;j++)
25         {
26             for (int k=1;k<=p;k++)
27             {
28                 for (int h=i;h;h--)
29                     f[j][k][h]=max(f[j-1][k][h],mx[j-1][k-1][h][k%2])+s[i][j]-s[h-1][j];
30                 mx[j][k][1][0]=-inf;
31                 for (int h=2;h<=i;h++)
32                     mx[j][k][h][0]=max(mx[j][k][h-1][0],f[j][k][h-1]);
33                 mx[j][k][i][1]=-inf;
34                 for (int h=i-1;h;h--)
35                     mx[j][k][h][1]=max(mx[j][k][h+1][1],f[j][k][h+1]);
36             }
37             ans=max(ans,max(f[j][p][i],mx[j][p][i][0]));
38         }
39     printf("%d\n",ans);
40     return 0;
41 }

不行,這種2D的dp我做得實在是太少了...


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: