输入为两行。 第一行一个整数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); } } }