一道有趣的题目 安慰MM 动态规划

安慰MM

Description

在一个数轴上,有n个MM在哭泣(5555~一直哭).

tcboy也在这个数轴上,并恰好看到了这一幕,由于每个MM哭都会让tcboy损失一定的rp,于是tcboy有必要去安慰她们.(真命苦啊 T.T)

开始时,tcboy站在k号MM的旁边.

现在知道第i个MM哭泣每秒钟会使tcboy降低 w[i]的rp (单位rp/s).

而tcboy的行走速度很慢只有1m/s .

tcboy安慰MM的方式很特别(怎么安慰随便大家YY了..#@%^%#@),不需要花费时间.

请计算tcboy安慰完所有MM,会消耗掉的rp的最小值.

Format

Input

输入文件的第一行包含一个整数N,2<=N<=1000,表示MM的数量。 第二行包含一个整数V,1<=V<=N,表示开始时tcboy站在几号MM的旁边. 接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每个MM,其中0<=D<=1000,0<=W<=1000。D表示MM在数轴上的位置(单位: m),W表示每秒钟会使tcboy降低W的rp。

Output

输出只有一行:一个整数,即消耗rp之和的最小值。结果不超过1,000,000,000。

Samples

输入数据 1

4
3
2 2
5 8
6 1
8 7
Copy

输出数据 1

56
Copy
#include
const int Max=1005;
using namespace std;
int f[Max][Max][2]={0},w[Max]={0},d[Max],n,v;
int main()
{
	cin>>n>>v;
	for(int i=1;i<=n;i++){
		cin>>d[i]>>w[i];
		w[i]+=w[i-1];
	}
	f[v][v][0]=f[v][v][1]=0;
	for(int i=v-1;i>=1;i--){
		f[i][v][0]=f[i+1][v][0]+(w[i]+(w[n]-w[v]))*(d[i+1]-d[i]);
		f[i][v][1]=f[i][v][0]+(w[i-1]+(w[n]-w[v]))*(d[v]-d[i]);
	}
	for(int j=v+1;j<=n;j++){
		f[v][j][1]=f[v][j-1][1]+(w[v-1]+(w[n]-w[j-1]))*(d[j]-d[j-1]);
		f[v][j][0]=f[v][j][1]+(w[v-1]+(w[n]-w[j]))*(d[j]-d[v]);
	}
	for(int i=v-1;i>=1;i--){
		for(int j=v+1;j<=n;j++){
			f[i][j][0]=min(f[i+1][j][0]+(w[i]+(w[n]-w[j]))*(d[i+1]-d[i]),f[i+1][j][1]+(w[i]+(w[n]-w[j]))*(d[j]-d[i]));
			f[i][j][1]=min(f[i][j-1][0]+(w[i-1]+(w[n]-w[j-1]))*(d[j]-d[i]),f[i][j-1][1]+(w[i-1]+(w[n]-w[j-1]))*(d[j]-d[j-1]));
		}
	}
	cout<<min(f[1][n][0],f[1][n][1]);
    return 0;
}


你可能感兴趣的:(C++,比赛,“算法”,动态规划,算法,数据结构,游戏,c++,开发语言)