首页 > 其他分享 >HDU 5492 Find a path 题解

HDU 5492 Find a path 题解

时间:2023-07-19 13:33:06浏览次数:37  
标签:HDU int 题解 sum 路径 上数 overline path LL

Description

在矩阵中,找一条到从 \((1,1)\) 到 \((n,m)\)(只能向上,右走)的路径,使路径上方差最小。输出方差平方乘 \(n+m-1\) 的结果。

对于所有数据,\(1\leq n,m,A_{i,j}\leq30\)。

Solution

设路径上的数为 \(A_{1},A_{2},A_{3},\cdots,A_{n+m-1}\),\(\overline{A}\) 为其平均数,则答案为 \(\displaystyle(n+m-1)\sum_{i=1}^{n+m-1}(A_i-\overline{A})^2\)。

推一下柿子,令 \(\displaystyle S=\sum_{i=1}^{n+m-1}A_i\),则:

\[(n+m-1)\sum_{i=1}^{n+m-1}(A_i-\overline{A})^2=\dfrac{1}{n+m-1}\sum_{i=1}^{n+m-1}((n+m-1)A_i-S)^2 \]

枚举 \(S\),令 \(f_{i,j}\) 为走到 \((i,j)\) 的最小代价,然后计算即可。

发现对于枚举的 \(S\) 不等于选出路径上数的和的情况,一定不如等于选出路径上数的和的情况优,所以不用管。

时间复杂度 \(\mathcal{O}(nmf)\),\(f\) 为从 \((1,1)\) 到 \((n,m)\)的路径的最大的和。在 \(n,m,A_{i,j}\) 同级的情况下相当于 \(O(n^4)\)。

Code

#include <bits/stdc++.h>
using namespace std;
namespace Milkcat {
    typedef long long LL;
    const int N = 105;
    LL n, m, ans, a[N][N], f[N][N];
    LL sqr(LL x) { return x * x; }
	LL solve(LL S) {
		f[1][0] = 0;
		for (int i = 1; i <= n; i ++)
			for (int j = 1; j <= m; j ++)
				f[i][j] = min(f[i - 1][j], f[i][j - 1]) + sqr((n + m - 1) * a[i][j] - S);
		return f[n][m];
	}
    int main() {
		memset(f, 0x3f, sizeof f);
        cin >> n >> m, ans = LLONG_MAX;
		for (int i = 1; i <= n; i ++)
			for (int j = 1; j <= m; j ++)
				cin >> a[i][j];
		for (int i = 1; i <= 1800; i ++)
			ans = min(ans, solve(i));
		cout << ans / (n + m - 1) << '\n';
		return 0;
    }
}
int main() {
	freopen("path.in", "r", stdin);
	freopen("path.out", "w", stdout);
    int T = 1;
    while (T --) Milkcat::main();
    return 0;
}

标签:HDU,int,题解,sum,路径,上数,overline,path,LL
From: https://www.cnblogs.com/Milkcatqwq/p/17565338.html

相关文章

  • 题解 序列合并
    题目链接首先不难想到,最小数的一定是\(a_1+b_1\),次小的数是\(a_1+b_2\)和\(a_2+b_1\)中小的。得出结论,若\(a_i+b_j\)是第\(k\)小,那么\(a_{i+1}+b_j\)和\(a_i+b_{j+1}\)有可能成为第\(k+1\)小。这是一个很优秀的性质,这意味着我们可以通过最小值推出次小值,再通过......
  • “范式杯”2023牛客暑期多校训练营1 蒻蒟题解
    A.AlmostCorrect题意:给定一个01串,要求构造一系列排序操作(xi,yi),使得经过这些排序操作后可以使与给定01串等长的所有其他01串完全排好序,而给定的01串无法完全排好序Solution构造题我们考虑到对0和1的位置进行统计,统计得出最左边的1的位置为l,最右边的0的位置为r我们进行三次......
  • 【SP21463 题解】
    Descirption给定\(n\timesm\)的矩阵,求最大子矩阵的面积满足每一行每一列都构成等差数列。Solution我们另\(up_{i,j}\)表示最小的\(k\)满足\((i,k),(i,k+1),\cdots,(i,j)\)构成等差数列,可以用\(\mathcalO(nm)\)求出。对于一个矩阵的左上角\((a,b)\),右下......
  • BZOJ 1461 题解
    考虑设计一个哈希函数\(hash(x)=f(x)\timesbase^x\)。其中\(f(x)\)表示\(\sum_{j=1}^{i-1}[j<i]\)。然后类似于滑动窗口计算区间哈希值,加入一个数就计算贡献,减去一个数就计算这个数产生了贡献,两个东西都可以树状数组维护,那么愉快做完了。#include<bits/stdc++.h>#de......
  • P5494 题解
    来一发\(O(\logn)\)线性空间的解法。考虑通过只维护线段树叶子节点的虚树的方法压缩空间,考虑记录下每个节点的编号,然后通过异或完求最低位的\(1\)的方式求出LCA的深度,然后记录下LCA右端点的编号。在回收节点的时候可以释放储存右端点编号的空间,但是这里为了方便就不这样......
  • UNR #7 Day2 T1 火星式选拔题解
    放一个比赛链接先考虑打完暴力后\(k=1\)的特殊性质。当队列容量为\(1\)时,队中的人\(i\)会被第一个满足\(i\leqj\)且\(b_i\leqa_j\)的人淘汰,并且队列中的人会变成\(j\),考虑倍增加速这个过程,令\(f_{i,j}\)表示第\(i\)个人进队后淘汰过程发生\(2^j\)次后队......
  • P6684 题解
    真的卡不动了,但是我感觉我的思路还是有一些价值的,就来写一篇题解吧。考虑使用回滚莫队(不增)来维护,当区间删去一个点时相当于全局加入一条边,这个询问的本质是询问是否是二分图,所以考虑扩展值域并查集,这里使用路径压缩加按秩合并,记录下修改,在回滚时全部还原。总复杂度是\(O(n\sqr......
  • 「JOISC 2019 Day4」蛋糕拼接 3 题解
    先考虑这个式子:\(\sum_{j=1}^{M}|C_{k_{j}}-C_{k_{j+1}}|\)一定是在\(C\)有序时取到,具体证明很简单各位读者自己证明。那么现在式子变成:\(\sum{V}+2\times({C_{\max}-C_{\min}})\)这个时候一个常见的技巧是将\(C\)排序。这个时候就可以定义状态:\(dp_{i,j}=\s......
  • Go安装的设置问题:GOROOT,GOPATH
    Mac下使用Google官方的Go语言安装包:https://code.google.com/p/go/downloads/list 安装的Go,会自动把/usr/local/go/bin目录加入PATH中。这样我们直接在控制台就可以执行go语言的一些命令。http://golang.org/cmd/go/#hdr-GOPATH_environment_variable 下面使用export命令看到......
  • hdu 2177 取(2堆)石子游戏 (博弈)
    题意:有两堆石子,两人轮流取石子,轮到某人时,有两种取法,要么从两堆石子中同时取出一定数量的石子,要么只从一堆中取任意数量的石子,不能不取。不能取的人判为输。普通思想:对于博弈问题,首先想到的就是sg函数。所以我们先从小到大的看局面。可以得出,对于每一种状态(x,y)x,y为石子堆。要么(x,y)本身......