hdu1558基础dp(求最大子矩阵)

思路:用一个二元组(i,j)来表示有下标为(i,j)的前缀和,那么又下标(i,j)的x*y的子矩阵的连续和就为ans = (i,j) - (i - x,j) - (i,j - y) + (i - x,j - y);

if (ans > max_num) max_num = ans;

两层循环完了后,最终结果就是ans;

Ps:一开始嫌弃第一种写法,结果第二种写法写丑了,wa了4发QAQ。。。

题目链接

/*****************************************
Author      :Crazy_AC(JamesQi)
Time        :2015
File Name   :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
using namespace std;
#define MEM(a,b) memset(a,b,sizeof a)
#define pk push_back
template<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}
template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}
typedef long long ll;
typedef pair<int,int> ii;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int dp[1010][1010];
int main()
{	
	// ios::sync_with_stdio(false);
	// freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
	int T,n,m,x,y;
	cin >> T;
	while(T--){
		cin >> n >> m >> x >> y;//x->n,y->m
		for (int i = 1;i <= n;++i)
			for (int j = 1;j <= m;++j)
				cin >> dp[i][j];
		int max_num = 0;
		for (int i = 1;i <= n;++i){
			for (int j = 1;j <= m;++j){
				dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
				if (i >= x && j >= y){
					int ans = dp[i][j] - dp[i - x][j] - dp[i][j - y] + dp[i - x][j - y];
					if (ans > max_num) max_num = ans;
				}
			}
		}
		cout << max_num << endl;
	}
	return 0;
}


/*****************************************
Author      :Crazy_AC(JamesQi)
Time        :2015
File Name   :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
/*
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
using namespace std;
#define MEM(a,b) memset(a,b,sizeof a)
#define pk push_back
template<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}
template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}
typedef long long ll;
typedef pair<int,int> ii;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int dp[1010][1010];
int a[1010][1010];
int n,m,x,y;
int main()
{	
	// ios::sync_with_stdio(false);
	// freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
	int T;
	cin >> T;
	while(T--){
		cin >> n >> m >> x >> y;
		for (int i = 1;i <= n;++i) for (int j = 1;j <= m;++j) cin >> a[i][j];
		MEM(dp, 0);
		for (int i = 1;i <= n;++i){
			for (int j = 1;j <= m;++j){
				a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
				if (i >= x && j >= y){
					int ans = a[i][j] - a[i - x][j] - a[i][j - y] + a[i - x][j - y];
					dp[i][j] = Get_Max(dp[i - 1][j],dp[i][j - 1]);
					dp[i][j] = Get_Max(ans,dp[i][j]);
				}
			}
		}
		cout << dp[n][m] << endl;
	}
	return 0;
}
*/


你可能感兴趣的:(dp,基础dp)