您的位置:首页 > 其它

(new) hdoj 1003(dp)(很经典的题目)

2013-04-28 11:41 429 查看


#include<iostream>
#include<stdio.h>
using namespace std;

#define  MAX 100005
//#define  MAX 15
int N;
int num[MAX];
int maxx=0;
int besti;
int bestj;

void dp()
{
int i,j;
for(i=0;i<N;i++)
{
int sum=0;
for(j=i;j<N;j++)
{
sum+=num[j];
if(sum>maxx)
{
maxx=sum;
besti=i;
bestj=j;
}
}
}
}

int main()
{
//freopen("in.txt","r",stdin);
int T;int time=0;
scanf("%d",&T);

for(time=1;time<=T;time++)
{
//初始化
scanf("%d",&N);
int i;maxx=0;besti=0;bestj=0;
for(i=0;i<N;i++)
{
scanf("%d",&num[i]);
}
dp();
printf("Case %d:\n",time);
printf("%d %d %d\n",maxx,besti+1,bestj+1);
if(time!=T)
printf("\n");
}
return 0;
}


这个是书上的代码。

时间复杂度是n^2

后来我认真研读,才发现,原来这个是最初的,没有经过化简的

并不是动态规划,这是暴力求解

b[j]=max(a[j],b[j-1]+a[j]);

从上到下理解

从最后一个开始求解,

当加入最后一个数字的时候,如果前面加到j的结果是>0的时候,把么表示可以加上。



从底向上求解



后来我发现还是过不了,然后发现,他所说的子串,至少要有一个元素

#include<iostream>
#include<stdio.h>
using namespace std;
#define  MAX 100009
//#define  MAX 20
int T;
int times;
int N;
int num[MAX];
int b[MAX];
int maxx;
int besti;
int bestj;

void dp()
{
int i;
int start=0;
if(num[0]>=-1001)
{
b[0]=num[0];
besti=0;
bestj=0;
start=0;
maxx=b[0];
}
else
b[0]=0;

for(i=1;i<N;i++)
{
int temp=0;

//如果这个点比较大,那么从这里打断
if(num[i]>b[i-1]+num[i])
{
start=i;
temp=num[i];
b[i]=temp;
}
//如果加上这个点以后,值变大了
else
{
temp=num[i]+b[i-1];
b[i]=temp;
}
if(temp>maxx)
{
maxx=temp;
bestj=i;
besti=start;
}
}
}

int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&T);
for(times=1;times<=T;times++)
{
//初始化
scanf("%d",&N);
memset(b,0,sizeof(b));
int i,j;besti=-1;bestj=-1;maxx=0;
maxx=-1001;
for(i=0;i<N;i++)
{
scanf("%d",&num[i]);
}
dp();
printf("Case %d:\n",times);
printf("%d %d %d\n",maxx,besti+1,bestj+1);

if(times!=T)
printf("\n");
}
return 0;
}


再后来递交还是不过

后来发现,#define的//没有去掉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: