题意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员以V的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了以后有更多的家庭订购,要将外卖送到的情况下使得所有用户的不开心值总和达到最小
思路:很明显,每多走一分钟,没送到的家庭的不开心值都会加倍,假设dp[i][j][0]表示从i到j用户送到时候的最小不开心值,此时送货员停在左边,dp[i][j][1]则表示停留在右边,那么就转化成了一个区间DP问题,显然从餐馆出发先往左右中间靠近的送是最优的,同时也保证了没有后效性。
状态有四种,
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(a[i+1].x-a[i].x)*(delay+a[i].v));
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(a[j].x-a[i].x)*(delay+a[i].v));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(a[j].x-a[i].x)*(delay+a[j].v));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(a[j].x-a[j-1].x)*(delay+a[j].v));
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 1010
#define inf 1e9
#define LL long long
int cas=1,T;
struct Node
{
int x,v;
}nodes[maxn];
int dp[maxn][maxn][2];
bool cmp(Node a,Node b)
{
return a.x<b.x;
}
int sum[maxn];
int main()
{
int n,v,x;
while (scanf("%d%d%d",&n,&v,&x)!=EOF)
{
for (int i = 1;i<=n;i++)
scanf("%d%d",&nodes[i].x,&nodes[i].v);
n++;
nodes[n].x=x;
nodes[n].v=0;
sort(nodes+1,nodes+1+n,cmp);
memset(sum,0,sizeof(sum));
for (int i = 1;i<=n;i++)
sum[i]=sum[i-1]+nodes[i].v;
int res;
for (int i = 1;i<=n;i++)
if (nodes[i].x==x)
{
res=i;
break;
}
for (int i = 1;i<=n;i++)
for (int j = 1;j<=n;j++)
dp[i][j][0]=dp[i][j][1]=inf;
dp[res][res][0]=dp[res][res][1]=0;
for (int i = res;i>=1;i--)
for (int j = res;j<=n;j++)
{
if (i==j)
continue;
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(sum[n]-sum[j]+sum[i])*(nodes[i+1].x-nodes[i].x));
dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(sum[n]-sum[j]+sum[i])*(nodes[j].x-nodes[i].x));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(sum[i-1]-sum[j-1]+sum[n])*(nodes[j].x-nodes[i].x));
dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(sum[n]-sum[j-1]+sum[i-1])*(nodes[j].x-nodes[j-1].x));
}
printf("%d\n",v*min(dp[1][n][0],dp[1][n][1]));
}
//freopen("in","r",stdin);
//scanf("%d",&T);
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}