02 最大连续子序列和 动态规划解法与数学证明

问题:输入一个整数数组,求出子连续序列和的最大值。

解:

最大子序列和即为mem table中的最大值,此处为14.

代码如下:

 1 #include<stdio.h>
 2
 3 static const int array[]={-1,-2,3,-1,2,1,-2,10,-8,-3,12};
 4 static int mem_table[2][11];
 5
 6 static int f(int i){
 7
 8     if(i<0) return array[0];
 9     if(mem_table[0][i])
10         return mem_table[1][i];
11     if(i==0){
12         mem_table[1][i]=array[0];
13         mem_table[0][i]=1;
14         return mem_table[1][i];
15     } else {
16         int i_1;
17         i_1=f(i-1);
18         mem_table[1][i]=(i_1>0)?(i_1+array[i]):array[i];
19         mem_table[0][i]=1;
20         return mem_table[1][i];
21     }
22
23 }
24
25 int main(){
26
27     //mem table init
28     int i,j;
29     for(i=0;i<2;i++)
30         for(j=0;j<11;j++)
31             mem_table[i][j]=0;
32
33     //dump
34     printf("table:\n");
35     for(i=0;i<2;i++) {
36         printf("\t");
37         for(j=0;j<11;j++)
38             printf("%5d ",mem_table[i][j]);
39         printf("\n");
40     }
41
42     //worker
43     printf("result:%d\n",f(10));
44
45     //dump
46     printf("table:\n");
47     for(i=0;i<2;i++) {
48         printf("\t");
49         for(j=0;j<11;j++)
50             printf("%5d ",mem_table[i][j]);
51         printf("\n");
52     }
53
54 }
时间: 2024-11-10 10:04:43

02 最大连续子序列和 动态规划解法与数学证明的相关文章

最大连续子序列和-动态规划

题目描述: 给定K个整数的序列{ N1, N2, -, NK },其任意连续子序列可表示为{ Ni, Ni+1, -, Nj },其中 1 <= i <= j <= K.最大连续子序列是所有连续子序中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20. 注意: 最大连续子序列和如果为负,则返回0:而本题目中的最大连续子序列和并不返回0,如果是全为负数,则返回最大的负数即可. 思路分析: -具有

经典面试题楼层丢鸡蛋问题的动态规划解法与数学解法

原题: 有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度.比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层. 问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点? 注意:只有两个鸡蛋.第一个鸡蛋碎了,第二个鸡蛋只能挨个楼层测试了. 动态规划解法: //height为楼层数 const int maxHeight = 100; int dp[maxHeight + 5] = { 0 }; for (int height = 1; height <= maxHei

动态规划:最大连续子序列和

问题:给出一个数组,求其连续子序列的最大和 package 动态规划; /** * 给出一个数组,求其连续子数组的最大和 * @author Administrator * */ public class MaxSum { public static void main(String[] args) { int[] arr = new int[]{-3,1,-3,4,-1,2,1}; int max=arr[0]; int current=arr[0]; for(int i=1;i<arr.le

HDU-1231-最大连续子序列(Java+DP动态规划)

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21101    Accepted Submission(s): 9361 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

动态规划--连续子序列的最大和

给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20. 注:为方便起见,如果所有整数均为负数,则最大子序列和为0. 算法一,穷举法,找出所有子数组,然后求出子数组的和,在所有子数组的和中取最大值 /*O(n^

动态规划:最大连续子序列乘积

题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第i个数结尾的连续子序列最大乘积, 若题目要求的是最大连续子序列和,则易确定状态转移方程为: dp[i]=max(data[i],dp[i-1]+data[i])(dp[i]为以第i个数结尾的连续子序列最大和) 但乘积存在负负得正的问题,即原本很小的负数成了一个负数反而变大了,(负数逆袭了), 故不能

动态规划经典题目:最大连续子序列和

最大连续子序列和问题 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20. 注:为方便起见,如果所有整数均为负数,则最大子序列和为0. 解决这样一个问题是一个很有趣的过程,我们可以尝试着从复杂度比较高的算法

动态规划 HDU1231-------最大连续子序列

Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20. 在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 子序列的第一个和最后

最大连续子序列和 分治思想和动态规划思想

解决最大连续子序列和的两种方法:分治,动态规划. 分治时间复杂度虽然更高,但我还是写了一遍加深对这种思想的理解:将一个问题分治成若干个小的同样思路的子问题来解决.本题将所求序列等分成左右两个子序列,愿序列的最大子序列和必是左序列最大子序列和,有序列最大子序列和,跨左右子序列最大和三者中的最大者. 动态规划:用dp[i]更新dp[i+1]就行. 分治: // // main.cpp // 1109 // // Created by Fangpin on 15/3/9. // Copyright (