time limit:10000ms memory limit:165888kb 64bit io format:%lld & %llu
hysbz 1084
這裡有乙個n*m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意:選出的k個子矩陣不能相互重疊。
第一行為n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下來n行描述矩陣每行中的每個元素的分值(每個元素的分值的絕對值不超過32767)。
只有一行為k個子矩陣分值之和最大為多少。
sample input
3 2 2
1 -3
2 3
-2 3
sample output
9雖然一看就是dp,可是一開始完全不知道如何dp,後來看到了資料範圍…笑了,當m=1的時候就是普通的最大連續子串和,麻煩的是當m=2的時候的狀態轉移很麻煩,我們設f[i][j][k]為第一列選前i個,第二列選前j個,選了k個時候的最大權值
那麼有
f[i][j][k] = max(f[i-1][j][k],f[i][j-1][l]);
f[i][j][k] = max(f[ii][j][k-1]+sum[ii+1][i][0]) 重新調整第一列
f[i][j][k]=max(f[i][jj][k-1]+sum[jj+1][j][1]) 重新調整第二列
當i==j時就是形成乙個矩陣,再處理就是了
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
int cas=1,t;
const
int maxn = 100;
const
int maxm =20;
using
namespace
std;
int n,m,k;
int a[maxn][maxn],sum[maxn][maxn],f[maxn][maxm],ff[maxn][maxn][maxm];
int main()}}
printf("%d\n",f[n][k]);
}else
}
}printf("%d\n",ff[n][n][k]);
}return
0;}
最大子矩陣 dp
已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1 8 這個子矩陣的大小是15。輸入是乙個n n的矩陣。輸入的第一行給出n...
最大子矩陣問題 dp
e acmer 題意 給你乙個矩陣,求它的所有元素和最大的子矩陣.分析 我們只知道一維的情況就是經典的最大子段和.然而維數達到二維就變的複雜了.我們觀察資料範圍500,易想到n3 的演算法也能過.純暴力是n4 的方法 然後可以通過列舉其中一維,dp最後一維的方法求出.處理列上的和為字首和,然後列舉列...
dp專題 最大子矩陣
題目大意 求乙個最大為100 100矩陣中的子矩陣中元素之和的最大值。列舉此子矩陣是第i行到第j行。然後壓成一維dp最大子段和。include include include include include include include include include include includ...