zoukankan      html  css  js  c++  java
  • POJ 2228 naptime

    环形DP

    先考虑如果只是一天,我们可以用线性DP写出转移方程,注意初始化
    如果是一个环的话,我们发现少了一种第n天和第一天连起来的情况,那么我们就再进行一次DP
    强制这种情况

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    using namespace std;
    const int MAXN = 10005;
    int dp[MAXN][2], dp2[MAXN][2], n, num[MAXN], m;
    int main() {
    	cin >> n >> m;
    	for(int i = 1; i <= n; i++) cin >> num[i];
    	memset(dp, 0xcf, sizeof(dp));
    	memset(dp2, 0xcf, sizeof(dp2));
    	dp[1][0] = 0; dp[1][1] = 0;
    	for(int i = 2; i <= n; i++) {
    		for(int j = min(m, i) ; j >= 1; j--) {
    			dp[j][0] = max(dp[j][0], dp[j][1]);
    			if(j >= 2) dp[j][1] = max(dp[j - 1][0], dp[j - 1][1] + num[i]);
    		}
    	}
    	dp2[1][1] = num[1];
    	for(int i = 2; i <= n; i++) {
    		//printf("%d
    ", i);
    		for(int j = min(m, i); j >= 1; j--) {
    			dp2[j][0] = max(dp2[j][0], dp2[j][1]);
    			if(j >= 2) dp2[j][1] = max(dp2[j - 1][0], dp2[j - 1][1] + num[i]);
    			else dp2[j][1] = -0x3f3f3f3f;
    			//printf("%d %d %d
    ", dp2[j][0], dp2[j][1], j);
    		}
    		//printf("
    ");
    	}
    	int ans = 0;
    	ans = max(dp[m][0], dp[m][1]);
    	//cout << ans << endl;
    	ans = max(ans, dp2[m][1]);
    	cout << ans << endl;
    	return 0;
    }
    
  • 相关阅读:
    angularjs 判断是否包含 permIDs|filter:'10'
    js日期格式化
    JSON格式检验
    CodeSmith Generator 6.5
    Hosts文件说明
    正则表达式匹配换行实例代码
    Codeforces 311E Biologist
    URAL 1349 Farm
    [SDOI2015] 序列统计
    洛谷 P3803 多项式乘法
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8615260.html
Copyright © 2011-2022 走看看