洛谷P2258 子矩阵


Topic Links

Topic meaning:在n行m列中找出一个r行c列的子矩阵,求此子矩阵最小的分值

Topic of solving:动态规划

枚举r行的全排列情况,对每一种情况运用动态规划求出其m列中选取c列算得的最小分值

设f[i][j]为前i列中选j列可得的最小分值,f[i][j]已选中第i列

则f[i][j]=min(f[i][j],f[k][j-1]+up[j]+hc[k][j]);j-1<=k

边界情况:

j=1即前i列选1列则只能是选中第i列

i=j即前i列均被选中

#include
#include
using namespace std;
int n,m,r,l,a[20][20],up[20],hc[20][20],dp[20][20];
int r_x[20],v_r[20],ans=10000000;
void choose(int amount,int now_r){
if(amount==r) {
for(int i=1;i<=m;i++){
up[i]=0;
for(int j=1;j>n>>m>>r>>l;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) cin>>a[i][j];
        for(int i=1;i<=n;i++){
        if(!v_r[i]){
        v_r[i]=1;r_x[1]=i;
        choose(1,i);
        v_r[i]=0;
        }
        }
        cout<