思路:利用动态规划的方法,求解最大m子段的和,由于这一题的数据量很大,所以不能用二维的dp 方 程,考虑优化 用一个temp[1000005]来存储前j个元素的i个子段的最大和,则有dp[j]=max(dp[j-1]+s[j],temp[j-1]]+s[j]) 表示以s[j]结尾的元素的最大的子段和
注意:输入数据很多使用scanf
代码: #include #include #include #include #include #include using namespace std; int s[1000005]; int dp[1000005]; int temp[1000005]; void DP(int m , int n){ int i , j , k; int max; memset(dp , 0 ,sizeof(dp)); memset(temp , 0 , sizeof(temp)); for(i = 1 ; i <= m ; i++){//用以个for循环遍历 max = -999999999;//注意这里的max要为无穷小,分别在求i子段最大和时候进行初始化 for(j = i ; j <= n ; j++){ dp[j] = (dp[j-1] + s[j]) > (temp[j-1] + s[j]) (dp[j-1] + s[j]) : (temp[j-1] + s[j]); temp[j-1] = max;//这里的temp[j-1]用来存储前面j-1的元素i子段最大值,注意不是temp[j]因为还没判 断是否max if(max < dp[j]) max = dp[j];//更新max } } cout< } int main(){ int i , j; int n , m; while(scanf("%d%d" , &m , &n) != EOF){ for(i = 1 ; i <= n ; i++) scanf("%d" , &s[i]); DP(m , n); } return 0; } 作者:cgl1079743846