zoukankan      html  css  js  c++  java
  • 51Nod-1270-数组的最大代价

    51Nod-1270-数组的最大代价

    数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。数组A的代价定义如下:
     
     
    (公式表示所有两个相邻元素的差的绝对值之和)
    给出数组B,计算可能的最大代价S。
    Input
    第1行:1个数N,表示数组的长度(1 <= N <= 50000)。
    第2 - N+1行:每行1个数,对应数组元素Bi(1 <= Bi <= 10000)。
    Output
    输出最大代价S。
    Input示例
    5
    10
    1
    10
    1
    10
    Output示例
    36

    题解:

    对于数组中的一个数, 无非就有两种选择:(1)它本身,(2),1, 所以明显的简易DP问题

    构建

    动态规划公式: f[i][0] 表示第i个数由他本身表示, f[i][1] 表示第i个数有1表示。 

    就有公式: 

        dp[i][0] = max(dp[i-1][0]+abs(num[i]-num[i-1]), dp[i-1][1]+abs(num[i]-1));
        dp[i][1] = max(dp[i-1][0]+abs(1-num[i-1]), dp[i-1][1]); 

    简易的DP方程

    #include <iostream> 
    #include <cstdio> 
    #include <cstring> 
    #include <cstdlib> 
    #include <cmath> 
    using namespace std; 
    const int MAXN = 50000; 
    
    int num[MAXN], dp[MAXN][2]; 
    
    int func(int n){
    	dp[0][0] = dp[0][1] = 0; 
    	for(int i=1; i<n; ++i){
    		dp[i][0] = max(dp[i-1][0]+abs(num[i]-num[i-1]), dp[i-1][1]+abs(num[i]-1)); 
    		dp[i][1] = max(dp[i-1][0]+abs(1-num[i-1]), dp[i-1][1]); 
    	}
    	return max(dp[n-1][0], dp[n-1][1]);  
    }
    
    int main(){
    	freopen("in.txt", "r", stdin); 
    
    	int n; 
    	while(scanf("%d", &n) != EOF){
    		for(int i=0; i<n; ++i){
    			scanf("%d", &num[i]); 
    		}
    		int ans = func(n); 
    		printf("%d
    ", ans );
    	}
    }
    

      

  • 相关阅读:
    PLSQL表
    CentOS服务器下JavaEE环境搭建指南(远程桌面+JDK+Tomcat+MySQL)
    数据分析业务调研
    Apache -poi
    Python入门经典
    高性能Linux服务器构建实战:运维监控、性能调优与集群应用
    新编 中文版CorelDRAW入门与提高
    早该这样学!Photoshop比你想的简单
    跟老男孩学Linux运维:MySQL入门与提高实践
    SQL查询的艺术
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/6388780.html
Copyright © 2011-2022 走看看