题目连接:https://www.luogu.org/problemnew/solution/P1220
解题思路:传递函数见代码
#include<bits/stdc++.h>
using namespace std;
int dp[51][51][2];//dp[i][j][k]表示i和j已选,k为0表示在左边,k为1表示在右边
int sum[60];
struct node
{
int x,v;
}s[60];
int main()
{
//freopen("t.txt","r",stdin);
int n,c;
scanf("%d%d",&n,&c);
sum[0]=0;
memset(dp,127,sizeof(dp));
dp[c][c][0]=dp[c][c][1]=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i].x,&s[i].v);
sum[i]=sum[i-1]+s[i].v;
}
for(int l=1;l<n;l++)
{
for(int i=1;i+l<=n;i++)
{
int j=i+l;
dp[i][j][0]=min(dp[i+1][j][0]+(s[i+1].x-s[i].x)*(sum[n]-sum[j]+sum[i]),dp[i+1][j][1]+(s[j].x-s[i].x)*(sum[n]-sum[j]+sum[i]));
dp[i][j][1]=min(dp[i][j-1][0]+(s[j].x-s[i].x)*(sum[n]-sum[j-1]+sum[i-1]),dp[i][j-1][1]+(s[j].x-s[j-1].x)*(sum[n]-sum[j-1]+sum[i-1]));
}
}
printf("%d",min(dp[1][n][0],dp[1][n][1]));
return 0;
}