题目传送:HDU - 1003
思路:最大子序列和
dp[i]= a[i] (dp[i-1]<0)
dp[i]= dp[i-1]+a[i] (dp[i-1]>=0)
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;
int n;
int main() {
int T;
int cas = 1;
scanf("%d", &T);
while(T --) {
scanf("%d", &n);
int sum = 0;
int ans = -INF;
int from, to;
int qi = 1, zhong = 1;
for(int i = 1; i <= n; i ++) {
int t;
scanf("%d", &t);
sum += t;
zhong = i;
if(sum > ans) {
ans = sum; from = qi; to = zhong;
}
if(sum < 0) {
qi = i + 1; sum = 0;
}
}
printf("Case %d:\n%d %d %d\n", cas ++, ans, from, to);
if(T != 0) printf("\n");
}
return 0;
}
题目传送:POJ - 1050
思路:最大子矩阵和,原理和上面那个题一样,就是把i~j行的列上的数加到一行去,再算该行的最大子序列和即可(0<=i<=j <n)
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;
int a[105][105];
int tmp[105];
int n;
int fun() {
int max = -1, sum = 0;
for(int i = 0; i < n; i ++) {
sum += tmp[i];
if(sum > max) max = sum;
if(sum < 0) sum = 0;
}
return max;
}
int main() {
while(scanf("%d", &n) != EOF) {
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n; j ++) {
scanf("%d", &a[i][j]);
}
}
int ans = -1;
for(int i = 0; i < n; i ++) {
memset(tmp, 0, sizeof(tmp));
for(int j = i; j < n; j ++) {
for(int k = 0; k < n; k ++) {
tmp[k] += a[j][k];
}
int t = fun();
if(ans < t) ans = t;
}
}
cout << ans << endl;
}
return 0;
}
HDU - 1003 - Max Sum && POJ - 1050 - To the Max (经典DP问题)
原文地址:http://blog.csdn.net/u014355480/article/details/45545861