您的位置:首页 > 产品设计 > UI/UE

PAT 甲级 1007. Maximum Subsequence Sum (DP 动态规划)

2018-02-20 17:52 351 查看
部分正确#include <iostream>
#include "cstring"
#include <stdio.h>
#include "iomanip"
#include "vector"
#include "cmath"
#include "stack"
#include "algorithm"
#include <math.h>
#include "map"
#include "queue"
using namespace std;
int main()
{

int k,c=0;
cin>>k;
int a[100000]={0};
int n=0;
while(k--)
{
cin>>a
;
if(a[n++]<0)
c++;
}

int i,maxx=0,sum=0,f1,f2,e;
f1=f2 =e=a[0];
int ff[1000]={0 };
int t=0;
for(i=0;i<n;i++)
{
sum+=a[i];
if(sum<0)
{
sum=a[i];
f1=a[i];

}

if(maxx<sum)
{
e=a[i];
f2=f1;
}
maxx=max(maxx,sum);
}
if(c==n )
cout<<0<<" "<<a[0]<<" "<<a[n-1];
else cout<<maxx<<" "<<f2<<" "<<e<<endl;

return 0;

}




没有用dp,尝试了很多测试数据,都发现不到问题在哪儿,后面该用dp动态规划,ac了,需要注意的就是如果全是负数的话,输出0 数组的首位 和 末尾,不然 4 过不去#include <iostream>
#include "cstring"
#include <stdio.h>
#include "iomanip"
#include "vector"
#include "cmath"
#include "stack"
#include "algorithm"
#include <math.h>
#include "map"
#include "queue"
using namespace std;
int main()
{

int n;
cin>>n;
int negative=0;
int a[10001]={0},dp[10001]={0},pos[10001]={0},e=0;//dp表示到第i的元素的最大和,pos表示第i的元素最大和的首位元素下标
for(int i=0;i<n;i++)
{
cin>>a[i];
dp[i]=a[i];
if(a[i]<0)
negative++;
}
int maxx=dp[0];
for(int i=1;i<n;i++)
{
if(dp[i]<dp[i-1]+a[i])//如果a[i]的值<前一位的最大和加上本身
{
dp[i]=dp[i-1]+a[i];//跟新当前的最大和
pos[i]=pos[i-1];//pos[i]指向第一位元素的小标
}
else{

pos[i]=i;//如果加上前一位最大和大于,也就是上一位位负数,这时候肯定不加上上一位,那就从当前位开始计数,下表为自己本身
}
if(maxx<dp[i])
{
maxx=dp[i];
e=i;
}

}
if(negative==n)
printf("0 %d %d",a[0],a[n-1]);
else
printf("%d %d %d",maxx,a[pos[e]],a[e]);

}


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