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]);
}
#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]);
}
相关文章推荐
- PAT 1007. Maximum Subsequence Sum (25)(dp动态规划)
- PAT(甲级)1007. Maximum Subsequence Sum (25)
- [PAT甲级]1007. Maximum Subsequence Sum(求连续最大子序列和)
- PAT 甲级 1007. Maximum Subsequence Sum
- 1007. Maximum Subsequence Sum (25)-PAT甲级真题(动态规划dp)
- PAT - 甲级 - 1007. Maximum Subsequence Sum (25)
- PAT (Advanced Level) 1007. Maximum Subsequence Sum (25) dp
- PAT 甲级 1007. Maximum Subsequence Sum
- PAT甲级 1007. Maximum Subsequence Sum (25)
- PAT 甲级 1007. Maximum Subsequence Sum (25) 【最大子串和】
- PAT 甲级 1007. Maximum Subsequence Sum
- PAT甲级-1007. Maximum Subsequence Sum (25)最大子序列和
- 【PAT甲级】【C++】1007. Maximum Subsequence Sum (25)
- PAT(甲级) 1007. Maximum Subsequence Sum (25)
- 【PAT甲级】1007. Maximum Subsequence Sum (25)
- PAT 甲级 1007. Maximum Subsequence Sum (25)
- [PAT-甲级]1007.Maximum Subsequence Sum
- pat 1007. Maximum Subsequence Sum (25)
- pat甲1007. Maximum Subsequence Sum
- (PAT)1007. Maximum Subsequence Sum