AtCoder Beginner Contest 163 E.Active Infants

AtCoder Beginner Contest 163 E.Active Infants

题目链接

在这里插入图片描述
这题我本来用暴力,发现有点问题,也一直没调出来,看了题解发现可以用 D F S DFS 加动态规划,用 d p [ i ] [ j ] dp[i][j] 表示 i i j j 范围内调整位置后的最大值,逐层递归即可,AC代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e3+5;
ll dp[N][N],n,k;
vector<pair<ll,ll> >v;

ll solve(ll l,ll r){
    if(r<l) return 0;
    if(dp[l][r]!=-1) return dp[l][r];
    ll i=l+n-r-1;
    return dp[l][r]=max(v[i].first*abs(v[i].second-l)+solve(l+1,r),v[i].first*abs(v[i].second-r)+solve(l,r-1));
}

int main(){
    cin>>n;
    for(ll i=0;i<n;i++){
        cin>>k;
        v.push_back({k,i});
    }
    sort(v.rbegin(),v.rend());
    memset(dp,-1,sizeof(dp));
    cout<<solve(0,n-1);
    return 0;
}
发布了479 篇原创文章 · 获赞 38 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/105632104
今日推荐