P2426 删数(动态规划)

#include<bits/stdc++.h>
using namespace std;

int a[105];
int dp[105][105];
int main()
{
	int n;
    cin>> n;
    for (int i = 1;i <= n;i++){
    	cin >> a[i];
    	dp[i][i] = a[i];
	}
	
	for (int j = 2;j <= n;j++){
		for (int i = j-1;i > 0;i--){
			dp[i][j] = abs(a[i] - a[j])*(j-i+1);
			for (int k = i;k < j;k++){
				dp[i][j] = max(dp[i][j] , dp[i][k]+dp[k+1][j]);
			}					
		}
	}
	cout <<dp[1][n];

	return 0;
}

删数

题目描述

N N N 个不同的正整数 x 1 x_1 x1, x 2 x_2 x2, …, x N x_N xN 排成一排,我们可以从左边或右边去掉连续的 i i i ( 1 ≤ i ≤ n ) (1 \le i \le n) (1in) 个数(只能从两边删除数),剩下 N − i N-i Ni 个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。

每次操作都有一个操作价值,比如现在要删除从 i i i 位置到 k k k 位置上的所有的数。操作价值为 ∣ x i − x k ∣ × ( k − i + 1 ) |x_i-x_k| \times (k-i+1) xixk×(ki+1) ,如果只去掉一个数,操作价值为这个数的值。
问如何操作可以得到最大值,求操作的最大价值。

输入格式

第一行为一个正整数 N N N ;

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

输出格式

一行,包含一个正整数,为操作的最大值

样例 #1

样例输入 #1

6
54 29 196 21 133 118

样例输出 #1

768

提示

【样例解释和说明】

说明,经过 3 3 3 次操作可以得到最大值,第一次去掉前面 3 3 3 个数: 54 54 54 29 29 29 196 196 196 ,操作价值为 426 426 426。第二次操作是在剩下的三个数 ( 21 , 133 , 118 ) (21,133,118) (21,133,118) 中去掉最后一个数 118 118 118,操作价值为 118 118 118。第三次操作去掉剩下的 2 2 2 个数: 21 21 21 133 133 133 ,操作价值为 224 224 224。操作总价值为 426 + 118 + 224 = 768 426+118+224=768 426+118+224=768

【数据范围】

3 ≤ N ≤ 100 3≤N≤100 3N100 1 ≤ x i ≤ 1000 1 \le x_i \le 1000 1xi1000

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值