神医胡青牛

说明

胡青牛是“倚天屠龙记”中的神医,每天都有N多(N<=2000)的人来求他治病,这些人排成一队,从1开始编号直到N
,每个人手里都拿着一个牌子,其上的值用Ai(1<=i<=N,1<=ai<=1000)代表,表示自己愿意付给胡大牛多少钱做为酬
金。胡神医每次从队首或队尾取一个人出来,治完这个人之后,他将获得M*Ai的Money其中M代表这个病人是第几个
被救治的。 

输入格式

如题

输出格式

如题

样例

输入数据 1

5
1
3
1
5
2

Copy

输出数据 1

43
Hint
胡大牛将按1, 5, 2, 3, 4的顺序来治人,赚得1x1 + 2x2 + 3x3 + 4x1 + 5x5 = 43.

 新初一Dp练习

思路

首先,不难发现,这个医生太黑心了!!!

所以,它必须接受制裁!!!

这道题可以用Dp,先构造一个数组:b[][]来存数。

再用DP即可。

代码见下:

#include<bits/stdc++.h>
using namespace std;
long long n,lk,k,a[2001],dd,b[2001][2001],m,sc[10001211],tt;
//map<int,long long> ;>>m
priority_queue<long long,vector<long long>,greater<long long>> q;
int main(){                                          
	cin>>n;                               
	for(int i=1;i<=n;i++){                   
		cin>>a[i];                       
	}                                     
	for(int i=1;i<=n;i++){
		for(int l=1;l+i-1<=n;l++){
			int j=i+l-1;
			b[l][j]=max(b[l][j],max(b[l+1][j]+a[l]*(n-i+1),b[l][j-1]+a[j]*(n-i+1)));
			//cout<<i<<" "<<j<<" "<<b[i][j]<<" "<<a[i]*(n-j+i)<<" "<<a[j]*(n-j+i)<<" "<<b[i-1][j]<<" "<<b[i][j+1]<<endl;
		}
	}
	for(int i=1;i<=n;i++){
		lk=max(lk,b[i][i]);
	}
	cout<<b[1][n];
	return 0;
}

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值