牛客 2019 多校 1 C E I dp 线段树 思维

C Euclidean Distance

题意: 给出高维空间的一个点A, 求另一个点P满足坐标非负且坐标和为1, 使得P到A的距离最小.

真正的思路: https://www.cnblogs.com/dillonh/p/11215846.html

虚假的思路: 本以为可以用拉格朗日乘子法做, 最后发现没有考虑坐标非负的条件, 不是只有等值约束,还有n个不等式约束, 所以L函数会多n个系数不会求...然后又用了KKT条件, 结果最后有ki*g(xi)=0, 网上找到的方法是枚举ki=0或者g(x)=0...2^n复杂度...xjb求果然做不出

虽然跟这个题的做法没有关系, 但是还是把看过的博客码一下, 有关拉格朗日乘子法和KTT条件:

https://www.cnblogs.com/liaohuiqiang/p/7805954.html

https://blog.csdn.net/weixin_41500849/article/details/80493712

https://blog.csdn.net/qq_34531825/article/details/52872819

E ABBA

题意: 给出AB的个数n, BC的个数m, 问有多少个长度为2*(n+m)的串是可以由n个AB子序列和m个BA子序列构成.

思路: 比赛时就没有好好想一下dp, 一直在对着表找规律, 最后也没有找出来. 虽然如此, 但是我感觉打表还是很有用的.

dp 刷表法

我们从串的第一位开始填字符, dp[i][j]表示当前用了i个A和j个B时, 会有多少种情况合法.

可以知道, 

假设有一个合法串,因为子序列n个AB和m个BA,那么显然有前n个A必为AB的A,前m个B必为BA的B。因为如果我前n个A中有一个是BA的A,那我是不是可以从更后面随便找一个A给这个B用,那么显然前n个A必为AB的A。

我们假设DP[i][j]为i个Aj个B,放A:

如果i < n那么可以直接放这个A,理由如上

如果i >= n,那么我们要确保这个A能给前面的B当BA用,那么当前BA需要的A是min(j, m)个,已经给他了i - n个,故(i - n) < min(j, m)则还可以继续放。

参考: https://www.cnblogs.com/KirinSB/p/11209560.html 

I Points Division

给出平面上n个点, 每个点有a价值和b价值, 现在划一条折线将平面分成A, B两部分, 使得A/B部分的任意一个点p/q满足, Xp<=Xq, Yp>=Yq. 在此基础上, 求A中a价值+B中b价值的最大值.

这条线是从左到右不下降(阶梯状上升的).

假设在线上的点, 属于B集合(将线移动到紧贴B集合的边缘).

dp[i]维护当i点在这条线上时, 所有考虑到的点的最大贡献.

dp[i]=max(dp[1~j])(Ⅰ)+b[i]

对于每个i, 不但要算出并更新当前其dp值(Ⅱ), 还要更新之前点的dp值(Ⅲ). 这个过程就是让之前每个点考虑到的点的范围. 这个过程相当于:

(Ⅲ)对于每个j∈1~n, dp[j]+=a[i](如果i在j上方)  dp[j]+=b[i](如果i在j下方)   不要忘记dp[j]代表j这个点恰好在线上.

因为考虑每个点都有三个操作: Ⅰ查找区间最大值, Ⅱ更新当前点的值, Ⅲ更新所有点的值(+a[i]或b[i]), 所以我们要用线段树维护区间最大值.

另外,上面提到的不论是i,j,1,n都是离散化后的y坐标.

对于所有的点, 要按x坐标从小到大,x坐标从大到小排序.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值