最大子序列和:HDU 1003 Max Sum
用动态规划的思想,求解前i个数能获得的最大和,当sum<0的时候,再加上a[i]就不如直接要a[i](不管a[i]是正是负),所以if sum < 0 then sum = 0,from = i+1;这里要更新起点
如果sum > ans则更新ans和起点、终点。
//Must so
#include<iostream>
#include<algorithm>
#include<cstdio>
#define mem(a,x) memset(a,x,sizeof(a))
#define sqrt(n) sqrt((double)n)
#define pow(a,b) pow((double)a,(int)b)
#define inf 1<<29
#define NN 1000006
using namespace std;
const double PI = acos(-1.0);
typedef long long LL;
int main()
{
int T;
cin>>T;
int kas = 1;
while (T--)
{
int n;
cin>>n;
int ans = -inf;
int f,t;
for (int i = 1,from = 1,to = 1,sun = 0,x;i <= n;i++)
{
to = i;
cin>>x;
sun += x;
if (sun > ans)
{
f = from,t = to,ans = sun;
}
if (sun < 0)
{
sun = 0;
from = i+1;
}
}
printf("Case %d:\n",kas++);
printf("%d %d %d\n",ans,f,t);
if (T) puts("");
}
return 0;
}
最大矩阵和: HDU 1081 To The Max
通过压缩的思想,将二维的矩阵压缩成一维,然后再按照一维的方法求解
//Must so
#include<bits/stdc++.h>
#define mem(a,x) memset(a,x,sizeof(a))
#define sqrt(n) sqrt((double)n)
#define pow(a,b) pow((double)a,(int)b)
#define inf 1<<29
#define NN 1000006
using namespace std;
const double PI = acos(-1.0);
typedef long long LL;
int f[111];//将前i行压缩成一行转换成一维来做
int a[111][111];
int main()
{
int n;
while (cin>>n)
{
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= n;j++)
{
scanf("%d",&a[i][j]);
}
}
int ans2 = -inf;
for (int i = 1;i <= n;i++)//以每一行为起点
{
mem(f,0);
for (int j = i;j <= n;j++)//第i行和后面的压缩
{
for (int k = 1;k <= n;k++)
{
f[k] += a[j][k];
}
int ans1 = -inf;
for (int k = 1,sun = 0;k <=n;k++)//这一部分和一维一样
{
sun += f[k];
if (sun > ans1) ans1 = sun;
if (sun < 0) sun = 0;
}
ans2 = max(ans1,ans2);
}
}
cout<<ans2<<endl;
}
return 0;
}