第一次提交的代码使用了递归,而由于数据比较大递归的层数比较多,导致出现了“栈溢出”。
第一次提交代码:
//模板开始
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <set>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include<iomanip>
#define SZ(x) (int(x.size()))
using namespace std;
int toInt(string s){
istringstream sin(s);
int t;
sin>>t;
return t;
}
template<class T> string toString(T x){
ostringstream sout;
sout<<x;
return sout.str();
}
typedef long long int64;
int64 toInt64(string s){
istringstream sin(s);
int64 t;
sin>>t;
return t;
}
template<class T> T gcd(T a, T b){
if(a<0)
return gcd(-a, b);
if(b<0)
return gcd(a, -b);
return (b == 0)? a : gcd(b, a % b);
}
//模板结束(通用部分)
//【练习09】简单动态规划 1002 Max Sum
int calculate_add_max(int* datas, int* add_max, int j, int n)
{
if(j == n - 1)
{
return datas[n - 1];
}
else
{
add_max[j + 1] = calculate_add_max(datas, add_max, j + 1, n);
if(add_max[j + 1] > 0)
{
return datas[j] + add_max[j + 1];
}
else
{
return datas[j];
}
}
}
int main()
{
ifstream ifs("shuju.txt", ios::in);
int cases;
int n;
int datas[100005];
int add_max[100005];
//ifs>>cases;
cin>>cases;
for(int i = 0; i < cases; i++)
{
//ifs>>n;
cin>>n;
for(int j = 0; j < n; j++)
{
//ifs>>datas[j];
cin>>datas[j];
}
add_max[0] = calculate_add_max(datas, add_max, 0, n);
int max = add_max[0];
int max_index = 0;
for(int j = 0; j < n; j++)
{
if(add_max[j] > max)
{
max = add_max[j];
max_index = j;
}
}
int j;
for(j = max_index + 1; j < n; j++)
{
if(add_max[j] <= 0)
{
cout<<"Case "<<i + 1<<":"<<endl;
cout<<add_max[max_index]<<" "<<max_index + 1<<" "<<j<<endl;
if(i != cases - 1)
{
cout<<endl;
}
break;
}
else
{
continue;
}
}
if(j == n)
{
cout<<"Case "<<i + 1<<":"<<endl;
cout<<add_max[max_index]<<" "<<max_index + 1<<" "<<n<<endl;
if(i != cases - 1)
{
cout<<endl;
}
}
}
return 0;
}
放弃递归,改用“递推”后成功AC。
第二次提交代码:
//模板开始
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <set>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include<iomanip>
#define SZ(x) (int(x.size()))
using namespace std;
int toInt(string s){
istringstream sin(s);
int t;
sin>>t;
return t;
}
template<class T> string toString(T x){
ostringstream sout;
sout<<x;
return sout.str();
}
typedef long long int64;
int64 toInt64(string s){
istringstream sin(s);
int64 t;
sin>>t;
return t;
}
template<class T> T gcd(T a, T b){
if(a<0)
return gcd(-a, b);
if(b<0)
return gcd(a, -b);
return (b == 0)? a : gcd(b, a % b);
}
//模板结束(通用部分)
//【练习09】简单动态规划 1002 Max Sum
int calculate_add_max(int* datas, int* add_max, int j)
{
return add_max[j + 1]>0?datas[j]+add_max[j + 1]:datas[j];
}
int main()
{
ifstream ifs("shuju.txt", ios::in);
int cases;
int n;
int datas[100005];
int add_max[100005];
//ifs>>cases;
cin>>cases;
for(int i = 0; i < cases; i++)
{
//ifs>>n;
cin>>n;
for(int j = 0; j < n; j++)
{
//ifs>>datas[j];
cin>>datas[j];
}
add_max[n - 1] = datas[n - 1];
for(int j = n - 2; j >= 0; j--)
{
add_max[j] = calculate_add_max(datas, add_max, j);
}
int max = add_max[0];
int max_index = 0;
for(int j = 0; j < n; j++)
{
if(add_max[j] > max)
{
max = add_max[j];
max_index = j;
}
}
int j;
for(j = max_index + 1; j < n; j++)
{
if(add_max[j] <= 0)
{
cout<<"Case "<<i + 1<<":"<<endl;
cout<<add_max[max_index]<<" "<<max_index + 1<<" "<<j<<endl;
if(i != cases - 1)
{
cout<<endl;
}
break;
}
else
{
continue;
}
}
if(j == n)
{
cout<<"Case "<<i + 1<<":"<<endl;
cout<<add_max[max_index]<<" "<<max_index + 1<<" "<<n<<endl;
if(i != cases - 1)
{
cout<<endl;
}
}
}
return 0;
}