zoukankan      html  css  js  c++  java
  • P2426 删数

    P2426 删数

    题目描述
    有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。

    每次操作都有一个操作价值,比如现在要删除从i位置到k位置上的所有的数。操作价值为|xi – xk|*(k-i+1),如果只去掉一个数,操作价值为这个数的值。 问如何操作可以得到最大值,求操作的最大价值。

    输入输出格式
    输入格式:
    第一行为一个正整数N;

    第二行有N个用空格隔开的N个不同的正整数。

    输出格式:
    一行,包含一个正整数,为操作的最大值


    可以看出是区间动态规划, 于是复习一下

    初始状态为 (dp[i][j] = abs(w[j] - w[i]) * len), 标准的断点两边之和为大区间的转移

    Code

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #include<climits>
    typedef long long LL;
    using namespace std;
    int RD(){
        int out = 0,flag = 1;char c = getchar();
        while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
        while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
        return flag * out;
        }
    const int maxn = 119;
    int num, a[maxn];
    int dp[maxn][maxn];
    int main(){
    	num = RD();
    	for(int i = 1;i <= num;i++)a[i] = RD(), dp[i][i] = a[i];
    	for(int len = 2;len <= num;len++){
    		for(int i = 1;i <= num - len + 1;i++){
    			int j = i + len - 1;
    			dp[i][j] = abs(a[j] - a[i]) * len;
    			for(int k = i;k <= j;k++){
    				dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
    				}
    			}
    		}
    	printf("%d
    ", dp[1][num]);
    	return 0;
    	}
    
  • 相关阅读:
    React Children 使用
    Redux 中间件和异步操作
    Redux 核心概念
    React 的setState 异步理解
    JS 中类型和类型转换
    ES6 新增集合----- Set 和Map
    ES6 新增基本数据类型Symbol
    ES6 解构赋值
    ES6 对象增强
    ES6 中的let 和 const
  • 原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9382040.html
Copyright © 2011-2022 走看看