杭电1003 ,好歹对了,但是空间复杂度挺高的。。。。。

/*这个算法是以前在编程之美上看过的,正好遇到了,做一下*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main(){
int n;
cin>>n;
int **a=new int* [n];
int **sum=new int *[n];//储存带有a[i]的最大值
int **maxsum=new int *[n];//储存全局的最大值
int p[20];
memset(p,0,sizeof(p));
for(int i=0;i<n;++i){
cin>>p[i];
a[i]=new int[p[i]];
sum[i]=new int[p[i]];
maxsum[i]=new int [p[i]];
for(int j=0;j<p[i];++j){
cin>>a[i][j];
}
}
int *maxpos=new int[n];
int *minpos=new int[n];
for(int i=0;i<n;++i){
maxsum[i][p[i]-1]=a[i][p[i]-1];
sum[i][p[i]-1]=a[i][p[i]-1];
maxpos[i]=p[i];
minpos[i]=p[i];
int temp1=maxpos[i];
     int temp2=minpos[i];
for(int j=p[i]-2;j>=0;--j){
if(a[i][j]>=a[i][j]+sum[i][j+1]){
sum[i][j]=a[i][j];
temp1=j+1;
temp2=j+1;
}
else
{
sum[i][j]=a[i][j]+sum[i][j+1];
temp2=j+1;
}
maxsum[i][j]=max(sum[i][j],maxsum[i][j+1]);
if(sum[i][j]>=maxsum[i][j+1]){
maxsum[i][j]=sum[i][j];
minpos[i]=temp2;
maxpos[i]=temp1;
}
else {
maxsum[i][j]=maxsum[i][j+1];
}

}

}
for(int i=0;i<n;++i){
  cout<<"Case "<<i+1<<":"<<endl<<maxsum[i][0]<<" "<<minpos[i]<<" "<<maxpos[i]<<endl;
if(i<n-1){
cout<<endl;
}
}
for(int i=0;i<n;++i){
delete a[i];
a[i]=NULL;
}
for(int i=0;i<n;++i){
delete maxsum[i];
maxsum[i]=NULL;
}
for(int i=0;i<n;++i){
delete sum[i];
sum[i]=NULL;
}
//system("pause");
//delete [][]a;
//delete [][]sum;
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值