【bzoj1560】【jsoi2009】【火星藏宝图】【dp】

本文介绍了一种使用动态规划(DP)解决特定问题的优化方法,通过应用完全平方公式来简化路径选择过程,确保了从起点到终点的路径始终最优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Input

Output

Sample Input

4 10
1 1 20
10 10 10
3 5 60
5 3 30

Sample Output

-4

HINT

题解:

首先数据范围虽然不全,但是裸dp肯定会T.

根据完全平方公式  (a+b)^2>=a^2+b^2;

所以我们可以发现,从A到B再到C,一定比从A直接到C要优。

所以对于每一列其实只有当前最靠下的点有用。

我们维护一下这些点,每次只用这些点去更新即可。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 200010
using namespace std;
struct use{int x,y,v;}a[N];
bool cmp(use a,use b){if (a.x==b.x) return a.y<b.y;else return a.x<b.x;}
int pos[N],n,m;
long long f[N];
int main(){
   scanf("%d%d",&n,&m);n+=2;
   a[1].x=a[1].y=1;a[2].x=a[2].y=m;
   for (int i=3;i<=n;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
   sort(a+2,a+n+1,cmp);
   pos[1]=1;
   for (int i=2;i<=n;i++){
      long long t=-999999999999999;
      for (int j=1;j<=a[i].y;j++)
        if (pos[j]) t=max(t,f[j]-(a[i].y-j)*(a[i].y-j)-(a[i].x-pos[j])*(a[i].x-pos[j])); 
      pos[a[i].y]=a[i].x;f[a[i].y]=t+a[i].v;
   }
   cout<<f[m]<<endl;    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值