羅区P2466 [SDOI2008]スーボール

タイトル説明

スーとサンディは最近、コンピュータゲームに夢中に、このゲームの物語は、海の美しさと神秘に作られたと興奮に満ちている、スーは小型・軽量ボートを持っています。しかし、スーの目標は海賊としてではなく、空気中に浮遊卵を収集するために、スーは彼女がちょうど卵の下に、その後、秘密兵器を使用する船外は瞬時に卵を集めることができるようになりますでしょう限り、秘密兵器を持っています。しかし、この卵はより多くのポイントを取得するにはスー、と空気着陸時に削減される卵はカリスマ、カリスマ、あなたは高いカリスマの時に卵を収集しようとしなければならないしている、と卵が海に落ちた場合それはカリスマが負の数になりますが、これは、すべての卵が異なるため、スーは、すべての卵を収集したい、スーの関心に影響を与えません。

しかし、サンディはとてもロマンチックなスー、サンディは、次のようにこの問題を解決するために、最初のゲームは、彼は抽象モデルとなっている、など多くのポイントを取得する必要はありませんでした。

スー水平面のx軸の初期位置。

N個の卵で空気を始め、卵i番目のために、整数座標(xi、yi)で示される彼の初期位置は、ゲームの開始後、それはviの単位距離/単位時間の速度で落下y軸負方向に沿って均一です。スーの初期位置は、(X 0、0)、スーは、x軸または負方向の正方向に移動させることができ、移動速度スーは、時間の単位距離/単位である、卵を与えるために秘密兵器を使用して、現在の卵のスコア瞬間であります千y座標。

さて、スーとサンディはスーとサンディそれぞれの目標を達成するために、あなたは上のすべての卵に基づいて最高のスコアを収集することを決定し、助けをお願いし、取得します。

入力形式

スペースで区切られた整数N、X0の最初の二つの行為、スーの初期位置を示す卵の数。

第二の動作N整数XI、スペースで区切られた2つの数の各々は、i番目の横軸は、i番目の初期卵を表します。

N個の整数のYIの第3行は、空白で区切られた各2つの数字は、i番目の初期縦軸は、i番目の卵を表します。

第四の線VI Nの整数、スペースで区切られた各2つの数、iはi番目の卵を落下のy軸負方向に沿って均一な速度を表す数値。

出力フォーマット

実数は、最高のスコアを取得することができ、ベースですべての卵を収集するために、小数点以下3桁に四捨五入。

サンプル入力と出力

エントリー
3 0 
-4 -2 2 
22 30 26 
1 8 9
輸出 
0.000

概念

まず%%%  バーソロミュー兄と彼の説明

そして、最高のスコアを計算する必要を参照してください、いくつかの制限が最初に考えDPは、あります

式DP [1]〜[I] [j]はjにIを表しは、次に[0] [i] [j]が得られた画分I後の結合位置を表し、得られた画分中のDPを卵の位置jを終え

異なるたびに、その後終了しているため、他の異なる卵の落下高さは、シフトダウンを継続する方法はありませんので、ギャングスターは、各DP値を考えるためにインスピレーションを得た後、直接私がjへのアクセス時間のロスに他の卵のスコアを数えます、そのような行動はの移転を促進するであろう!

まずDP [0] [I] [J]、彼は位置に私だったので、それがdp [0/1] [I + 1] [J]以上、マイナスのボールスピードと他から転送されなければならないので、時間(すなわち、時間Iボール)を乗じ、前記速度が予めプレフィックスとアウトであってもよいです。

次いで、DP [1]〜[I] [J]と同様

最大最終的な答えは、DP [0] [1]〜[n]とDP [1] [1]〜[n]がかかり

転写式:
DP [0] [I]、[J] = MAX(DP [0] [J] - ([I + 1] .X - [I] .X)*(他のボール[+ 1 I]および速度)、DP [1]〜[I + 1]〜[J] - ([J] .X - [I] .X)*( 速度及び他のボール))

DP [1]〜[I] [J] = MAX(DP [0] [I] [J-1] - ([J] .X - [I] .X)*(速度及び他のボール) DP [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