/*最大字段和问题
以第i位数字结尾的最大字段和等于前一个字段和加上本身的值或者等于本身;
动态转移方程为:dp[i]=max(dp[i-1]+a[i],a[i]);
如 8,34,-67,98,3,5,-7,43
dp[0]=8;
因为dp[0]大于0,所以dp[1]=dp[0]+a[1];
因为dp[1]大于0,所以dp[2]=dp[1]+a[2];
因为dp[2]小于0,所以dp[3]=a[3];
因为dp[3]大于0,所以dp[4]=dp[3]+a[4];
因为dp[4]大于0,所以dp[5]=dp[4]+a[5];
因为dp[5]大于0,所以dp[6]=dp[5]+a[6];
因为dp[6]大于0,所以dp[7]=dp[6]+a[7];
*/
#include<iostream>
using namespace std;
int main(){
int a[8]={8,34,-67,98,3,5,-7,43};
int dp[8]={0},temp[8]={0};//dp数组中的dp[i]用来记录以数组a[i]结尾的最大字段和
dp[0]=a[0];
temp[0]=1; //temp数组用来标记 如果从第i个数开始的temp[i]=1;如果是连续的加temp[i]=2;
for(int i=1;i<8;i++){
if(dp[i-1]<0){
dp[i]=a[i];
temp[i]=1; //标记dp[i]=a[i]的位置
}
else{
dp[i]=dp[i-1]+a[i];
temp[i]=2; //标记dp[i]=dp[i-1]+a[i]的位置
}
}
int ttemp,mmax=dp[0];
for(int i=1;i<8;i++){
if(mmax<dp[i]){
mmax=dp[i]; //记录最大字段和
ttemp=i; //标记最大字段和的位置
}
}
cout<<mmax<<endl;
for(int i=ttemp;i>=0;i--){
if(temp[i]==1){
mmax=i; //记录最大字段和开始的位置
break;
}
}
for(int i=mmax;i<=ttemp;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
以第i位数字结尾的最大字段和等于前一个字段和加上本身的值或者等于本身;
动态转移方程为:dp[i]=max(dp[i-1]+a[i],a[i]);
如 8,34,-67,98,3,5,-7,43
dp[0]=8;
因为dp[0]大于0,所以dp[1]=dp[0]+a[1];
因为dp[1]大于0,所以dp[2]=dp[1]+a[2];
因为dp[2]小于0,所以dp[3]=a[3];
因为dp[3]大于0,所以dp[4]=dp[3]+a[4];
因为dp[4]大于0,所以dp[5]=dp[4]+a[5];
因为dp[5]大于0,所以dp[6]=dp[5]+a[6];
因为dp[6]大于0,所以dp[7]=dp[6]+a[7];
*/
#include<iostream>
using namespace std;
int main(){
int a[8]={8,34,-67,98,3,5,-7,43};
int dp[8]={0},temp[8]={0};//dp数组中的dp[i]用来记录以数组a[i]结尾的最大字段和
dp[0]=a[0];
temp[0]=1; //temp数组用来标记 如果从第i个数开始的temp[i]=1;如果是连续的加temp[i]=2;
for(int i=1;i<8;i++){
if(dp[i-1]<0){
dp[i]=a[i];
temp[i]=1; //标记dp[i]=a[i]的位置
}
else{
dp[i]=dp[i-1]+a[i];
temp[i]=2; //标记dp[i]=dp[i-1]+a[i]的位置
}
}
int ttemp,mmax=dp[0];
for(int i=1;i<8;i++){
if(mmax<dp[i]){
mmax=dp[i]; //记录最大字段和
ttemp=i; //标记最大字段和的位置
}
}
cout<<mmax<<endl;
for(int i=ttemp;i>=0;i--){
if(temp[i]==1){
mmax=i; //记录最大字段和开始的位置
break;
}
}
for(int i=mmax;i<=ttemp;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}