【7.31】代码源 - 【矩阵操作】【宝箱】【New Stone Game】【等差数列】

#804. 矩阵操作

题意:

在这里插入图片描述
题解:(思维) 代码源每日一题 Div1 矩阵操作

思路:首先,判是否有解。如果操作行,那么这一行的差分不变。如果操作列,对应两列的差分变化相同。因此判断每一行的差分是否相同。

如有解,我们不妨先做完所有行操作,再做所有列操作(影响与先后顺序无关)。做完所有行操作后,必然是所有行都相同,且有一行是不会操作的(证明)。那我们 枚举 最终等于哪一行,先把其他行操作与这一行相同,再搞列操作。

证明:如果我们的解是对于每一行都有操作的,那我们把每行进行的操作转化为每列进行的操作(影响是相同的),那么一定可以构造出一组新的解,且存在一行没有行操作。

AC代码:http://oj.daimayuan.top/submission/311931


#806. 宝箱

题意: X X X 坐标轴上有 N ( 1 ≤ N ≤ 1 0 5 ) N(1\leq N\leq 10^5) N(1N105) 个钥匙和 N N N 个宝箱, 玩家初始位置为 x = 0 x=0 x=0 , 每一步可以走到 x + 1 x+1 x+1 或者 x − 1 x−1 x1 .

同一个位置可以同时出现宝箱和钥匙, 但同一位置不会出现超过一个宝箱或超过一个钥匙.

当玩家到达一个有钥匙的位置时, 他可以将钥匙捡起. 当玩家到达一个有宝箱的位置时, 他可以选择使用一个钥匙将宝箱打开.

试求出玩家最少需要走多少步才能打开所有宝箱.

题解:代码源每日一题-宝箱(贪心/思维)

思路:贪心 / DP。容易知道,我们的路线一定是:向右走,拿到若干钥匙,回头开若干宝箱。重复上述若干次,然后径直走到最后,再回头停留在某宝箱处。

我们可以枚举最终落脚点,那么次数就是 2 × max ⁡ ( a n , b n ) − a i + s i − 1 2\times \max(a_n,b_n) -a_i+s_{i-1} 2×max(an,bn)ai+si1 ,其中 s i s_i si 表示回头开启前 i i i 个宝箱要多走的路。我们要递推出来这个 s i s_i si

s i = s i − 1 + d t s_i=s_{i-1}+dt si=si1+dt
a i ≥ b i a_i\geq b_i aibi 时,不需要回头, d t = 0 dt=0 dt=0
a i < b i a_i < b_i ai<bi 时,我们有两种选择。1. 开完前 i − 1 i-1 i1 个宝箱,然后拿 i i i 钥匙回去开 i i i 宝箱。 2. 拿到 i − 1 i-1 i1 钥匙后顺带 i i i 钥匙,回去开 i , i − 1 ⋯ i,i-1\cdots i,i1 宝箱。

我写的时候没有考虑到顺带的情况。还是要把所有情况考虑上。

AC代码:http://oj.daimayuan.top/submission/312073


#854. New Stone Game

题意:在3*3的格子上玩Nim游戏,特殊的地方是先后手第一次必须全部拿完。存在空行或者空列则无法操作,输。问先手初手有多少种选择是必胜态。

题解:(Nim游戏)代码源每日一题 Div1 New Stone Game

思路:

挖掘性质:

  1. 如果一个人操作前,该行或该列上存在 0 0 0 ,则操作此点为必输态。
  2. 最终的必输态一定是一个特殊点为 0 0 0 ,剩下的点(除特殊点和先后手初手点)为 1 1 1 的状态。

那么我们枚举先后手选择哪些格子,转化为 NIM 游戏。

思考普通博弈题时,通常从最终的必输态或必胜态开始研究,向上推结论。 比如这道题最终必输态就如 ∗ , 1 , 1 1 , 0 , 1 1 , 1 , ∗ \begin{matrix} * ,1,1\\ 1,0,1 \\ 1,1,* \end{matrix} ,1,11,0,11,1, ,然后就是普通的 NIM 了。

AC代码:http://oj.daimayuan.top/submission/313001


#843. 等差数列

题意:给定一个大小为 n ( n ≤ 5000 ) n(n\leq 5000) n(n5000) 的集合 { S } \{S\} {S} , 你可以从中挑选若干个数组成等差数列, 求最长的等差数列长度。

题解:(DP/双指针)代码源每日一题 Div1 等差数列

思路:刚开始写了个 O ( n 2 × log ⁡ n ) O(n^2\times \log n) O(n2×logn) 的 DP ,但是会 T 。

我们定义 d p ( i , j ) dp(i,j) dp(i,j) 表示后两项为 a i , a j ( i < j ) a_i,a_j(i<j) ai,aj(i<j) 的等差数列的最长长度。一个朴素的转移方式是,枚举 a k ( k < i ) a_k(k<i) ak(k<i) ,从 d p ( k , i ) dp(k,i) dp(k,i) 转移过来,然而这个转移是 O ( n ) O(n) O(n) 的,总为 O ( n 3 ) O(n^3) O(n3)

我们考虑怎么优化。我们可以先排一下序(答案与序列顺序无关),这样当我们固定 i i i ,枚举 j j j 时, k k k 也是有单调性的, j j j 向右则 k k k 向左。当 a k + a j = 2 × a i a_k+a_j=2\times a_i ak+aj=2×ai 时可以进行转移。那么做法就是枚举 i i i j j j 向右滑动, k k k 向左滑动,从 d p ( k , i ) dp(k,i) dp(k,i) 转移到 d p ( i , j ) dp(i,j) dp(i,j) ,时间复杂度平方级别。感觉是一个挺新奇的转移方式。

AC代码:http://oj.daimayuan.top/submission/313331

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是求解多元多项式回归的 MATLAB 代码: ```matlab % 输入数据 x1 = [36.4 37.2 37.2 36.2 31.5 28.9 27.2 26.7 26.1 26.1 25.4 25.3 25.4]'; x2 = [50.0 52.0 49.0 51.0 68.0 74.0 83.0 82.0 88.0 88.0 90.0 88.0 87.0]'; x3 = [982.9 982.2 981.8 981.6 982.3 982.6 983.4 983.5 984.0 983.6 984.4 984.5 984.4]'; y = [-7.30 -7.36 -7.35 -7.33 -7.31 -7.30 -7.26 -7.22 -7.21 -7.23 -7.18 -7.17 -7.14]'; % 构建设计矩阵X X = [ones(size(x1)) x1 x2 x3 x1.^2 x1.*x2 x1.*x3 x2.^2 x2.*x3 x3.^2]; % 求解回归系数 beta = X \ y; % 构建预测模型 model = @(x1,x2,x3) beta(1) + beta(2)*x1 + beta(3)*x2 + beta(4)*x3 ... + beta(5)*x1.^2 + beta(6)*x1.*x2 + beta(7)*x1.*x3 ... + beta(8)*x2.^2 + beta(9)*x2.*x3 + beta(10)*x3.^2; % 预测并绘制拟合图 x1fit = min(x1):0.1:max(x1); x2fit = min(x2):0.1:max(x2); x3fit = min(x3):0.1:max(x3); [X1FIT,X2FIT,X3FIT] = meshgrid(x1fit,x2fit,x3fit); YFIT = model(X1FIT,X2FIT,X3FIT); figure; plot3(x1,x2,x3,'o',x1fit,x2fit,x3fit,'*'); hold on; mesh(X1FIT,X2FIT,X3FIT,YFIT); xlabel('x1'); ylabel('x2'); zlabel('x3'); title('拟合图'); % 绘制残差图 YFIT = model(x1,x2,x3); figure; plot(YFIT - y,'o'); xlabel('样本编号'); ylabel('残差'); title('残差图'); ``` 运行上述代码后,会先绘制拟合图,然后绘制残差图。拟合图中,蓝色的点表示原始数据,红色的点表示拟合值,可以看到拟合值与原始数据比较接近;残差图中,横轴表示样本编号,纵轴表示残差,残差的分布应该比较均匀,没有明显的规律。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值