atcoder 163E——DP

題目鏈接

題意:n個小孩,每個人有一個位置pi,還有一個權值Ai。求任意交換位置之後,每個小孩權值✖交換位置距離之和最大是多少。

解析:貪心的思路,權值越大的小孩就越往邊上去。仔細想一下應該是一個區間DP

dp[l][r]=max(dp[l][r],max(dp[l+1][r]+Ai×pildp[l][r1]+Ai×pir))dp[l][r]=max(dp[l][r],max(dp[l+1][r]+A_i×|p_i-l|,dp[l][r-1]+A_i×|p_i-r|))

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
int dp[2010][2010];
int a[2010];
struct node
{
    int first;
    int second;
}c[5001];


bool cmp(node p1,node p2)
{
    return p1.second>p2.second;
}

int work(int now,int l,int r)
{
	if (l>r)  return c[now].second;
	if (dp[l][r]!= -1)  return dp[l][r];

	int f=work(now+1,l+1,r)+c[now].second*abs(c[now].first-l);
	int s=work(now+1,l,r-1)+c[now].second*abs(c[now].first-r);
	dp[l][r]=max(dp[l][r], max(f,s) );

	return dp[l][r];
}
int main()
{
    int n;
    cin>>n;
    memset(dp,-1,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        c[i].second = a[i];
        c[i].first = i;
    }
    sort(c+1,c+1+n,cmp);
    cout<<work(1,1,n);
   
}

#define int long long 是真的騷啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章