Atcoder Grand Contest 035D - Add and Remove

這一套題的質量都非常不錯。

dp[l][xl][r][xr]=minl<m<rdp[l][xl][m][xl+xr]+dp[m][xl+xr][r][xr]+(xl+xr)Am.dp[l][x_l][r][x_r] = min_{l<m<r} dp[l][x_l][m][x_l + x_r] + dp[m][x_l + x_r][r][x_r] + (x_l + x_r)A_m.
最後的答案是每一個數乘上一個係數相加而得。
dpdp就是計算了不同係數下的最小值。
llrr表示區間的左、右邊界。xlx_lxrx_r表示llrr的係數。
中間的數的係數肯定是左右兩個數的係數之和。
模擬dpdp即可。
CodeCode:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[20];
ll dp(int l,int r,ll xl,ll xr)
{
	if(l+1==r)return 0;
	ll ans=1e18;
	for(int i=l+1;i<r;i++)
		ans=min(ans,dp(l,i,xl,xl+xr)+dp(i,r,xl+xr,xr)+(xl+xr)*a[i]);
	return ans;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	printf("%lld",dp(1,n,1,1)+a[1]+a[n]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章