【决策单调性分治优化/四边形不等式优化】阿拉伯的劳伦斯 lawrence

前言

其实这道题本来是要求用斜率优化和四边形不等式优化的...

但是我硬生生做成了决策单调性给交上去了哈哈哈哈...老师应该不会查水表的吧(大雾

题目

1S/128MB

M T. E. 劳伦斯是第一次世界大战中饱受争议的人物。他是一名在阿拉伯战区服役 的英国军官,率领着一群阿拉伯人对奥图曼帝国开展游击战。他袭击的主要目标 是铁路。有关劳伦斯的虚构功绩反映在一部大制作电影“阿拉伯的劳伦斯”中。 请你写一个程序帮助劳伦斯计算出怎样最优化地利用他有限的资源。你有一些英国情报部门提供的信息。

首先,铁路线是完全线性的,即没有任何分支和岔道。 其次, 英国情报部门对每个车站标记了战略价值——即一个 1~5 之间的整数。

一条铁路线的战略总价值是所有相邻两个车站的战略价值乘积之和。

例如下图:

这条铁路线的战略总价值为: 4*5 + 4*1 + 4*2 + 5*1 + 5*2 + 1*2 = 49

假设劳伦斯只有发动一次袭击的战斗资源,而且他不可能去袭击车站,因为车站 的防守是非常坚固的。他只能去袭击车站之间的铁路线。

例如,劳伦斯选择去袭 击中间的铁路线:

那么剩下的战略价值为 4*5 + 1*2 = 22

但如果劳伦斯去袭击 4 和 5 之间的铁路线:

那么剩下的战略价值为 5*1 + 5*2 + 1*2 = 17

这是劳伦斯最佳的选择。

给出铁路线的描述和劳伦斯能发动袭击的次数, 计算出能获得的最小的战略总价值。
Input

有多组测试数据,每组数据格式为:

第 1 行: 2 个整数: n (1≤n≤1000)表示车站的个数, m (0≤m

第 2 行: n 个整数, 每个数在 1~5 之间,表示按顺序排列的 n 个车站的战略价 值。

最后一行 n=0 且 m=0, 表示数据结束。
Output

对每组数据,在一行上仅输出一个整数,表示最小的战略总价值。
Sample Input

4 1

4 5 1 2

4 2

4 5 1 2

0 0
Sample Output

17

2

分析

经观察可发现本题——还是很“板”(2333)

与这道题差不多:监狱警卫

本质上还是【分组\分段+计算花费】

可以写出DP定义与转移方程:

dp[ i ][ j ]:1~j个车站分成i段

对于最后一段i,假设从第k到j的车站铁路为最后第i段

dp[ i ][ j ]=min( dp[ i ][ j ],dp[ i-1 ][ k-1 ]+cost( k , j );

初始化:dp[ 1 ][ 1~n ]=INF

关于【cost的计算】——哇,哭了,居然考数学功底...

我们发现,任意一段区间a1,a2……ai的权值可以这么计算:

s=(a1a2+……+a1ai)+(a2a3+……+a2ai)+……=[(a1+a2+……+ai)^2−(a1^2+a2^2+……+ai^2)]/2

也就是(这一段sum的平方-这一段各数平方之和)/2。

前缀和分别预处理即可

然后直接套用【决策单调性分治优化】或【四边形不等式优化】即可,详见代码

Ps.本题只要求了【最多炸m次】,即【最多分成m+1段】,并没有严格限制,所以最后统计答案的时候要从分1~m+1段中取最小值

决策单调性分治优化-代码

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll MAXN=1000,INF=0x3f3f3f3f;
ll a[MAXN+5],dp[MAXN+5][MAXN+5],pre[MAXN+5],s[MAXN+5];
ll n,m,ans=INF;
void DP(ll d,ll i,ll j,ll optl,ll optr)//决策优化 
{
	if(i>j)
		return ;
	ll mid=(i+j)/2;
	ll opt=INF,id;
	//暴力计算二分点的dp值opt与最小决策点id 
	for(int k=optl;k<=min(optr,mid);k++)
	{
		ll cur=dp[d-1][k-1]+((pre[mid]-pre[k-1])*(pre[mid]-pre[k-1])-(s[mid]-s[k-1]))/2;
		if(cur

四边形不等式优化-代码

咕咕

你可能感兴趣的:(决策单调性分治优化,四边形不等式优化,动态规划)