PAT 1001
代码
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
struct dpdata{
int value;
int leftIndex;
int rightIndex;
dpdata(int v,int l,int r){
value=v;
leftIndex=l;
rightIndex=r;
}
};
int main(){
int k;
cin>>k;
int data[10005];
for (int i=0;i<k;i++)
{
scanf("%d",&data[i]);
}
vector<dpdata> dp;
dp.push_back(dpdata(data[0],0,0));
dpdata maxValue=dp[0];
for (int i=1;i<k;i++)
{
if(data[i]>=data[i]+dp[i-1].value){
dp.push_back(dpdata(data[i],i,i));
}
else{
dp.push_back(dpdata(data[i]+dp[i-1].value,dp[i-1].leftIndex,i));
}
if (dp[i].value>maxValue.value){
maxValue=dp[i];
}
}
// 如果所有数都小于0,那么认为最大的和为0,并且输出首尾元素。
if (maxValue.value>=0){
cout<<maxValue.value<<" "<<data[maxValue.leftIndex]<<" "<<data[maxValue.rightIndex];
}
else{
cout<<0<<" "<<data[0]<<" "<<data[k-1];
}
return 0;
}
解题思路
经典动态规划,注意区分,连续子串,子串的区别
dp最难的就是如何找到dp数组的含义,本题dp数组为以i截止的最大子串和
测试点问题
如果数据全部为负数,则和为0 ,输出元素为首尾元素