首页 > 代码库 > 最大连续子序列乘积
最大连续子序列乘积
假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max来表示以a结尾的最大连续子串的乘积值,用Min表示以a结尾的最小的子串的乘积值,那么状态转移方程为:Max=max{a, Max[i-1]*a, Min[i-1]*a};Min=min{a, Max[i-1]*a, Min[i-1]*a};初始状态为Max[1]=Min[1]=a[1]
Java实现(在oj上测试有RuntimeError错误)
1 package longest_multiple; 2 3 import java.util.Scanner; 4 5 6 public class Main { 7 8 final static int N = 100001; 9 static double a[] = new double[N];10 static double Min[] = new double[N];11 static double Max[] = new double[N];12 13 static double max(double a, double b) {14 return (a > b) ? a : b;15 }16 17 static double min(double a, double b) {18 return (a < b) ? a : b;19 }20 21 static double longest_multile(double a[], int n) {22 23 Max[0] = Min[0] = a[0];24 double max_value = http://www.mamicode.com/a[0];25 for (int i = 1; i < n; i++) {26 27 Max[i] = max(max(a[i], Max[i - 1] * a[i]), Min[i - 1] * a[i]);28 Min[i] = min(min(a[i], Max[i - 1] * a[i]), Min[i - 1] * a[i]);29 if (max_value < Max[i]) {30 max_value =http://www.mamicode.com/ Max[i];31 }32 }33 return max_value;34 }35 36 public static void main(String[] args) {37 Scanner sc = new Scanner(System.in);38 while (sc.hasNext()) {39 40 int n = sc.nextInt();41 42 for (int i = 0; i < n; i++) {43 a[i] = sc.nextDouble();44 }45 double res = longest_multile(a, n);46 if (res < 0) {47 System.out.println("-1");48 } else {49 if (res - (int) res <= 1e-5) {50 System.out.println((int) res);51 } else {52 53 System.out.printf("%.2lf\n", res);54 }55 }56 }57 }58 59 }
C语言实现
1 #include <stdio.h> 2 3 #define LEN 100000 4 5 int N; 6 double data[LEN]; 7 double max[LEN]; 8 double min[LEN]; 9 10 double Max(double a, double b){11 return (a > b) ? a : b;12 }13 14 double Min(double a, double b){15 return (a < b) ? a : b;16 }17 18 double MMS(){19 int i;20 double ans;21 max[0] = min[0] = data[0];22 ans = data[0];23 for (i = 1; i < N; ++i){24 max[i] = Max(Max(data[i], max[i-1]*data[i]), min[i-1]*data[i]);25 min[i] = Min(Min(data[i], max[i-1]*data[i]), min[i-1]*data[i]);26 ans = Max(ans, max[i]);27 }28 return ans;29 }30 31 int main(void){32 int i;33 double ans;34 while (scanf("%d", &N) != EOF){35 for (i = 0; i < N; ++i)36 scanf("%lf", &data[i]);37 ans = MMS();38 if (ans < 0)39 printf("-1\n");40 else if (ans - (int)ans <= 1e-5)41 printf("%lld\n", (int)ans);42 else43 printf("%.2lf\n", ans);44 }45 46 return 0;47 }
最大连续子序列乘积
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。