输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
所有连续子数组中和最大的值。
3 -1 2 1
3
#include <iostream>
#include <limits.h>
using namespace std;
int main()
{
int num = 0;
cin >> num;
int curMax = 0;
int max = INT_MIN;
for(int i = 0; i < num; i++)
{
int temp = 0;
cin >> temp;
curMax += temp;
if(curMax > max)
{
max = curMax;
}
if(curMax < 0)
{
curMax = 0;
}
}
cout << max << endl;
}
一开始理解错了题意,做成了求最大数值连续的子序列的最大值,恍然大悟发现,这题连数组都用不着建
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
int max = -1e5, now = 0,m;
cin >> n;
vector<int> a;
for (int j = 0; j < n; j++)
{
cin >> m;
a.push_back(m);
}
for (int j = 0; j < n;j++)
{
now += a[j];
if (now>max)
max = now;
if (now < 0)
now = 0;
}
cout << max<<endl;
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n;
int a[120000];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int ans=a[1];//初始化一下
int t=a[1];
for(int i=2;i<=n;i++)
{
if(t>=0)
t+=a[i];
else
t=a[i];
ans=max(ans,t);
}
cout<<ans<<endl;
return 0;
} 这题贼奇怪,全负数竟然不输出0,而是输出最大的负数。所以还得判断全负数的情况。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
while(s.hasNext()){
int n = s.nextInt();
int[] a = new int[n];
for(int i=0;i<n;i++){
a[i]=s.nextInt();
}
int maxSum = 0;
int thisSum = 0;
int count = 0;//计负数的个数,判断是否为全负数
int maxOfnegative = Integer.MIN_VALUE;//表示负数中最大的负数
for(int i=0;i<n;i++){
if(a[i]<0){
count++;
if(a[i]>maxOfnegative){
maxOfnegative = a[i];
}
}
thisSum+=a[i];
if(thisSum>maxSum){
maxSum=thisSum;
}else if(thisSum<0){
thisSum = 0;
}
}
if(count==n){//表示全为负数,输出最大的负数
System.out.println(maxOfnegative);
}else{
System.out.println(maxSum);
}
}
}
}
#include <stdio.h>#include <stdlib.h>intmain(){intlen=0, iIndex=0;int*pData = NULL;scanf("%d", &len);if(len<=0)return-1;pData = (int*)malloc(sizeof(int)*len);for(iIndex=0; iIndex<len; ++iIndex)scanf("%d", &pData[iIndex]);intmaxSum = pData[0];intnCurSum = pData[0];for(inti=0; i<iIndex; ++i){if(nCurSum<=0)nCurSum = pData[i];elsenCurSum += pData[i];if(nCurSum > maxSum)maxSum = nCurSum;}printf("%d", maxSum);return0;}
/*
dp保存的是某一段连续的和,当dp[i]+v[i]<0时,证明v[i]已经不能取了,那么dp[i+1]重新
置0,如果大于0,证明v[i]还可能可以取,然后用m来找最大值。全部为负数的解决办法是用
m=max(v[i], m)来找负数里面的最大值。
*/
#include <iostream>
#include <vector>
using namespace std;
int sum(vector<int> &v) {
vector<int> dp(v.size() + 1, 0);
int m = -1e9;
for(int i = 0; i < v.size(); i ++) {
if(dp[i] + v[i] < 0) {
dp[i + 1] = 0;
m = max(v[i], m);
}
else {
dp[i + 1] = dp[i] + v[i];
m = max(dp[i + 1], m);
}
}
return m;
}
int main() {
int n;
cin >> n;
vector<int> v(n);
for(int i = 0; i < n; i ++) {
cin >> v[i];
}
cout << sum(v) << endl;
} #include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 7;
int p[maxn];
int sum[maxn];
int sum_max(int len) {
int res = -1;
sum[0] = p[0];
for(int i = 1; i < len; i++) {
sum[i] = max(sum[i - 1] + p[i], p[i]);
res = max(sum[i], res);
}
return res;
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> p[i];
}
cout << sum_max(n) << endl;
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char const *argv[])
{
int n;
cin>>n;
vector<int> vec(n);
for(int i=0;i<n;i++){
cin>>vec[i];
}
vector<int> dp(n);
dp[0]=vec[0];
int res=vec[0];
for(int i=1;i<n;i++){
dp[i]=max(dp[i-1]+vec[i],vec[i]);
res=max(dp[i],res);
}
cout<<res<<endl;
return 0;
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int[] a = new int[n];
a[0] = sc.nextInt();
int max=a[0];
for(int i=1;i<n;i++){
a[i] = sc.nextInt();
if( a[i-1]>=0 ){
a[i] = a[i-1]+a[i];
}
if( max<a[i] ){
max = a[i];
}
}
System.out.println(max);
}
sc.close();
}
}
#include <iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
bool flag=false;
int *list=new int[n];
for(int i=0;i<n;i++){
cin>>list[i];
if(list[i]>0)
flag=true;
}
int count=0;
int max=0;
if(flag){
for(int i=0;i<n;i++){
count+=list[i];
if(count<0){
count=0;
}
if(max<count){
max=count;
}
}
}
else{
max=list[0];
for(int i=0;i<n;i++){
if(list[i]>max)
max=list[i];
}
}
cout<<max<<endl;
}
} #include <cstdio>
#include <algorithm>
int dp[100001], x[100001];
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
for (int i = 0; i<n; i++)
{
scanf("%d", x + i);
}
dp[0] = x[0];
long long max_ans = dp[0];
for (int i = 1; i<n; i++)
{
dp[i] = std::max(x[i], dp[i - 1] + x[i]);
if(dp[i]>max_ans)
max_ans = dp[i];
}
printf("%lld\n", max_ans);
}
return 0;
} 动态规划问题
设dp[i]表示以第 i个元素为结尾的连续子数组的最大和,则递推方程式为 dp[i]=max{dp[i-1]+a[i], a[i]};
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n;
while(scan.hasNextInt()){
n=scan.nextInt();
int[] array=new int[n];
for(int i=0;i<n;i++)
array[i]=scan.nextInt();
int[] dp=new int[n];
dp[0]=array[0];
int max=array[0];
for(int i=1;i<n;i++){
if(dp[i-1]+array[i] > array[i])
dp[i]=dp[i-1]+array[i];
else
dp[i]=array[i];
if(dp[i]>max)
max=dp[i];
}
System.out.println(max);
}
}
}
var count=read_line();
var numbers=read_line();
var array=numbers.split("");
var max_sum=0;
max_sum=array[0];
var arr2=[];
for(var i=1;i<array.length;i++){
// max_sum+=array[i];
if(array[i]>array[i-1]+max_sum){
max_sum=array[i];
arr2.push(max_sum);
}
else{
max_sum+=array[i];
arr2.push(max_sum);
}
}
arr2.sort(function(a,b){
returnb-a;
});
console.log(arr2[0]);
我写了html文档自己定义一个数组测试时对的啊,但是这里就是怎么都运行不了,哪位大神知道在牛客网上js编程怎么获取输入的字符串吗?
|
// 经典dp问题
// 假设dp[n]表示以n为最后一个元素的子数组和的最大值,
// 因此, dp[n] = max(dp[n-1],0)+num[n];
// 当然实现的时候,没有必要设置一个数组保存所有的情况,因为只是用到了前一个位置的计算结果。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = 0;
while(sc.hasNext()){
n = sc.nextInt();
int[] num = new int[n];
for(int i=0;i<n;i++){
num[i] = sc.nextInt();
}
int max = num[0];
int sum = num[0];
for(int i=1;i<n;i++){
if(sum>=0){
sum += num[i];
}else{
sum=num[i];
}
if(sum>max)max=sum;
}
System.out.println(max);
}
}
}