查网站怎么做的哈尔滨网站建设公司哪家好
web/
2025/9/27 4:31:50/
文章来源:
查网站怎么做的,哈尔滨网站建设公司哪家好,网站优化关键词价格,网站备案批量查询首先对于m1的情况非常容易处理#xff08;其实这儿因为边界我错了好久。。。#xff09;#xff0c;直接DP就好了#xff0c;设f[i][k]为这个矩阵前i个选k个矩阵的最大和#xff0c;那么f[i][k]max(f[j][k-1]sum[j1][i])#xff0c;那么对于m2的时候类似与m1的时候#… 首先对于m1的情况非常容易处理其实这儿因为边界我错了好久。。。直接DP就好了设f[i][k]为这个矩阵前i个选k个矩阵的最大和那么f[i][k]max(f[j][k-1]sum[j1][i])那么对于m2的时候类似与m1的时候设w[i][j][k]为左面的一行前i个中右面的一行前j个中一共选k个矩阵能选取得最大矩阵。 那么转移也比较明显有一下几种转移 w[i][j][k]max(w[i-1][j][k],w[i][j-1][k])这种情况代表什么都不选。 w[i][j][k]max(w[ii][j][k-1]sum[ii1][i][0])这种情况代表在左面一行重新确定i这个位置如何选取。 类似的w[i][j][k]max(w[i][jj][k-1]sum[jj1][j][1])这种情况代表在右面一行重新确定i这个位置如何选取。 当ij的时候w[i][j]max(w[ii][ii]sum[ii1][i][2])这样就代表选了一个占两行的矩形然后注意枚举的边界就可以了。 反思开始我的想法是w[i][k]代表两行矩阵前i个选k个矩阵的最大值我们可以知道选取矩阵的方法肯定是若干段只选取一行的组合然后由选取两行的隔开那么我们可以枚举i代表在i出选取占两行的矩形这个矩形的长可以为0那么w[i][k]max(w[j][k]f[j1][ii]sum[ii][i])这个转移就是先枚举上一次的断点然后后枚举上一断点到i的情况就是一段只选取一行的加上一个占两行的最大值那么首先要处理每一行的f[i][j][k]值代表i,j段选取k个矩阵的最大值。后来因为转移的时候枚举边界特别麻烦没有调出来再仔细想想之后发现这种转移由于状态数太少没办法准确的表达每一个状态所以转移起来非常麻烦所以就加了一维可以准确的表达所有状态而且转移十分方便复杂度也降低了一个k因为上一种方法需要枚举左右两行各选多少矩形总之还是自己太弱了。。。 /**************************************************************Problem: 1084User: BLADEVILLanguage: CResult: AcceptedTime:88 msMemory:1672 kb
****************************************************************///By BLADEVIL
#include cstdio
#include cstring
#include algorithm
#define maxn 100
#define maxm 20using namespace std;int n,m,k;
int a[maxn][maxn],sum[maxn][maxn],f[maxn][maxm],w[maxn][maxn][maxm];int main(){scanf(%d%d%d,n,m,k);sum[0][1]sum[0][2]0;for (int i1;in;i) for (int j1;jm;j) scanf(%d,a[i][j]),sum[i][j]sum[i-1][j]a[i][j];if (m1){memset(f,0,sizeof(f));for (int i1;in;i) {f[i][0]0;for (int l1;lk;l){f[i][l]f[i-1][l];for (int j0;ji;j){f[i][l]max(f[i][l],f[j][l-1]sum[i][1]-sum[j][1]);}}}printf(%d\n,f[n][k]);} else {memset(w,0,sizeof(w));for (int i1;in;i) {for (int j1;jn;j){w[i][j][0]0;for (int l1;lk;l){w[i][j][l]max(w[i-1][j][l],w[i][j-1][l]);for (int ii0;iii;ii) w[i][j][l]max(w[i][j][l],w[ii][j][l-1]sum[i][1]-sum[ii][1]);for (int jj0;jjj;jj) w[i][j][l]max(w[i][j][l],w[i][jj][l-1]sum[j][2]-sum[jj][2]);if (ij)for (int jj0;jji;jj)w[i][i][l]max(w[i][i][l],w[jj][jj][l-1]sum[i][1]-sum[jj][1]sum[j][2]-sum[jj][2]);}} }printf(%d\n,w[n][n][k]);}return 0;
} 转载于:https://www.cnblogs.com/BLADEVIL/p/3560067.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82541.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!