Ло Гу P2466 [SDOI2008] Сью мяч

Название Описание

Сью и Сэнди недавно подсел на компьютерную игру, сюжет этой игры сделан на красоту и тайны моря и полный азарта, Сью имеет компактный и легкий катер. Однако, цель Си не как пират, но собирать яйца, плавающие в воздухе, Си есть секретное оружие, до тех пор, пока она будет лодка, чтобы чуть ниже яйца, а затем использовать секретное оружие будет в состоянии собрать яйца в одно мгновении , Тем не менее, яйца имеют харизму, харизма это яйцо будет сокращена во время воздушного десантирования с, Сью Чтобы получить больше очков, вы должны попытаться собрать яйца в период высокой харизмы, и если яйцо падает в море это харизма станет отрицательным числом, но это не влияет на интерес Си, потому что каждое яйцо отличается, Сь хочет собрать все яйца.

Но Сэнди не так романтично Сь, Сэнди хочет получить как можно больше очков, для того, чтобы решить эту проблему, первая игра, которую он стал абстрактной моделью выглядит следующим образом:

Су горизонтальной плоскости, где начальное положение оси х.

Начиная воздух с N яйцом, для I-го яйца, его исходное положение обозначено целые координатами (Xi, Yi), после начала игры, то однородно вдоль оси у отрицательного направления падающего на скорости VI единицы расстояния / единицы времени. Исходное положение Си (х0, 0), Сь может перемещаться в положительном направлении оси х или отрицательного направление, скорость движения Сь единицы расстояние / единица времени, используя секретное оружие, чтобы дать яйцо мгновенно, счет для текущего яйца тысячных у координаты.

Теперь, Сью и Сэнди попросить вас помочь, чтобы удовлетворить Сью и Песчаные соответствующие цели, вы решили собрать самый высокий балл на основе всех яиц, получить.

Формат ввода

Первый два акта целых чисел N, x0, разделенные пробелами, количество яиц, показывающее исходное положение Си.

Второе поведение N целые числа XI, каждый из двух чисел, разделенных пробелом, по горизонтальной оси I-й представляет собой I-й начальное яйцо.

Третий ряд целых чисел N уг, каждые два числа, разделенные пробелом, I-й начальная ордината представляет I-го яйца.

Четвертая строка В.И. N целые числа, каждые два числа, разделенные пробелом, число я представляет собой I-го яйца равномерную скорость вдоль оси у отрицательном направлении падения.

Формат вывода

Действительное число, округленное до трех знаков после запятой, чтобы собрать все яйца на основе, может получить высокий балл.

Пример ввода и вывода

запись
3 0 
-4 -2 2 
22 30 26 
1 9 8
экспорт 
0,000

Основная идея

Во- первых %%%  Варфоломей старший брат и его объяснение

Тогда видит необходимость вычислить самый высокий балл, есть некоторые ограничения, первая мысль дп

Уравнение дп [1] [I] [J] обозначает я, чтобы затем закончил J яйцо позиции J в полученной фракции, дп [0] [I] [J] представляет положение сцепления после полученной фракции я

Потому что каждый раз разные затем закончил, другая различную высоту падения яйца нет никакого способа продолжать смещаться вниз, так что после Gangster вдохновлен думать каждое значение йра непосредственно сосчитать множество других яиц в потере времени доступа к I J , такое действие будет способствовать передаче! ! !

Во-первых дп [0] [я] [J], потому что он был в положении я, поэтому он должен быть переведен из дп [0/1] [я + 1] [J] более, минус скорость мяча и другие умноженный на время (то есть время, я шар), и отличающееся тем, что скорость может быть предварительно префиксом и вне.

Тогда дп [1] [I] [J] Аналогично

Максимальный окончательный ответ принимает дп [0] [1] [п] и др [1] [1] [п]

Уравнение переноса:
DP [0] [I] [J] = макс (DP [0] [. + 1 I] , [J] - (А [I + 1.] .x - A [I] .x) * (другие шары и скорость), дп [1] [г + 1] [J] - (а [J] .x - это [я] .x) * ( скорость и другие шары))

дп [1] [I] [J] = макс (дп [0] [I] [J-1] - (а [J] .x - это [я] .x) * (скорость и другие шары), дп [1] [I] [J-1] - (а [J] .x - это [J-1] .x) * (и другие шары скорость))

PS: Для целей страхования, все координаты плюс абсолютное значение вычитания рекомендуется, не забудьте ответить на первоначальный счет тысячных

Приложить код:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXN 100100
int n, m, cnt, sum[1100], dp[2][1100][1100];
struct node
{
	int x, y, v;
}a[MAXN];
bool cmp(node x, node y)
{
	return x.x < y.x;
}
int main()
{
	scanf("%d%d",&n,&a[0].x);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].x);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].y);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].v);
	sort(a+1,a+n+1,cmp); 
	for(int i=1;i<=n;i++) sum[i] = sum[i-1] + a[i].v;
	for(int i=1;i<=n;i++) dp[0][i][i] = dp[1][i][i] = a[i].y - sum[n] * abs(a[i].x - a[0].x);//, printf("%d\n",dp[0][i][i]);
	//就一个球的话需要从初始位置走过去 
	for(int len = 2;len<=n;len++)
	{
		for(int i=1;i<=n-len+1;i++)
		{
			int j = i+len-1;
			dp[0][i][j] = max(dp[1][i+1][j] - abs(a[j].x-a[i].x) * (sum[i] + sum[n] - sum[j]), dp[0][i+1][j] - abs(a[i+1].x - a[i].x) * (sum[i] + sum[n] - sum[j])) + a[i].y;
			dp[1][i][j] = max(dp[1][i][j-1] - abs(a[j].x-a[j-1].x) * (sum[i-1] + sum[n] - sum[j-1]), dp[0][i][j-1] - abs(a[j].x - a[i].x) * (sum[i-1] + sum[n] - sum[j-1])) + a[j].y;
		}//sum为前缀和统计答案,计算答案 
	}
	int Max = max(dp[0][1][n], dp[1][1][n]);
	printf("%.3lf\n",(double)Max * 0.001);
	
	return 0;
}

рекомендация

отwww.cnblogs.com/tuihuaddeming/p/11620736.html