• HDU1024_Max Sum Plus Plus


    题意:n个元素的数组,求分成m个不相交段的方法,使这m段之和最大,输出最大和

    思路:dp,状态dp[i][j]表示前j个物品分成i段的最大和,

        状态转移方程:dp[i][j]=max(dp[i][j-1]+arr[j],max(dp[1][j-1]~dp[i-1][j-1] )+arr[j])

        决策:第j个物品①放入现有的i组合求和 成为第i组,与前面的i-1组求和

        数据量大,用一维数组压缩一下空间

    代码:

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    
    using namespace std;
    #define maxn 1001001
    #define inf 0x3f3f3f3f
    int dp[maxn];
    int maxpre[maxn];
    int arr[maxn];
    int m, n;
    
    int main() {
    	while (scanf("%d %d", &m, &n) != EOF) {
    		for (int i = 1; i <= n; i++) {
    			scanf("%d", &arr[i]);
    			dp[i] = 0;
    			//maxpre[i] = -2;
    			maxpre[i] = 0;
    		}
    		int mmax = -inf;
    		maxpre[0] = 0;
    		dp[0] = 0;
    
    		for (int i = 1; i <= m; i++) {
    			mmax = -inf;
    			for (int j = i; j <= n; j++) {
    				dp[j] = max(dp[j - 1] + arr[j], maxpre[j - 1] + arr[j]);
    				//cout << dp[j] << endl;
    				maxpre[j - 1] = mmax;
    				mmax = max(mmax, dp[j]);
    			}
    		}
    		printf("%d
    ", mmax);
    	}
    }
    一开始把maxpre全设为无穷小,结果第二组样例小了1。。。

    把dp值全打印出来,发现在状态转移的时候,dp[2]跟-1结合了,因为-inf太小。。。orz

  • 相关阅读:
    多线程(5)async&await
    多线程(4)Task
    多线程(3)ThreadPool
    多线程(2)Thread
    多线程(1)认识多线程
    泛型
    反射(4)反射性能问题:直接调用vs反射调用
    反射(3)反射应用:一个插件项目
    反射(2)使用反射
    反射(1)认识反射
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611334.html
Copyright © 2020-2023  润新知