组合数学 - BZOJ 3997 - TJOI2015】的更多相关文章

TJOI2015 Problem's Link ---------------------------------------------------------------------------- Mean: N×M的网格,一开始在(1,1)每次可以向下和向右走,每经过一个有数字的点最多能将数字减1,最终走到(N,M). 问至少要走多少次才能将数字全部变为0 (N,M<=1000,ai,j<=106) analyse: 结论题. 设d(i,j)d(i,j)=max(d(i−1,j),d(i…
3997: [TJOI2015]组合数学 题意:\(n*m:\ n \le 1000\)网格图,每个格子有权值.每次从左上角出发,只能向下或右走.经过一个格子权值-1.至少从左上角出发几次所有权值为0. 容易发现偏序关系 \[ x_1 \le x_2, y_1 \le y_2 \] 最少链数=最长反链大小 但是本题每个元素有权值 容易发现,最少链数=最大权值反链的权值 然后我沙茶的写了一个\(O(n^4)\)的DP就T掉了 怒写二维树状数组,A了 其他人怎么辣么快啊,然后发现直接 f[i][j]…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题意] 给定一个nm的长方形,每次只能使经过格子权值减1,每次只能向右向下,问最少需要走多少次才能使所有格子权值为0. [思路] 因为每次只能向右或向下走,所以对于(i,j)和(i’,j’)当且仅当两点任一个不在另一个的左下方时两点才不在同一条路径上. 将长方形反转左右. 设f[i][j]为使以ij右下角的长方形权值为0的走的最少次数,则有转移式: f[i][j]=max{…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题目大意] 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走. 问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝, 而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. [题解] 最小链覆盖=最长反链,反链的意思就是该集合中的点相互之间不互达, 在该题中,最长反链可以用dp得出. [代码] #include <c…
分析一下样例就可以知道,求的实际上是从左下角到右上角的最长路 因为对于任意不在这个最长路的上的点,都可以通过经过最长路上的点的路径将这个点的价值减光 (可以用反证法证明) 之后就是一个非常NOIP的DP了 #include<cstdio> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> using namespace std; const int…
3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 919  Solved: 664 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. Input 第一行为正整数T,代表数据组数. 每组数据第一行为正整数N,M代表网格图有…
3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 247  Solved: 174[Submit][Status][Discuss] Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完.   Input 第一行为正整数T,代…
题意 \(N \times M\)的网格,一开始在\((1, 1)\)每次可以向下和向右走,每经过一个有数字的点最多能将数字减1,最终走到\((N, M)\).问至少要走多少次才能将数字全部变为\(0\).(\(N, M<=1000, a_{i, j}<=10^6\)) 分析 结论题QAQ,不会证明... 题解 设\(d(i, j)\) \(d(i, j) = max( d(i-1, j), d(i, j+1), d(i-1, j+1) ) + a[i, j]\) 答案是\(d(n, 1)\)…
这个题我脑洞了一个结论: 首先,我们定义满足以下条件的路径为“从右上到左下的路径”: 对于路径上任何不相同的两个点 $(x_1, y_1)$,$(x_2, y_2)$,都有: $x_1\neq x_2, y_1\neq y_2$ 若 $x_1 > x_2$,则有 $y_1 < y_2$:否则当 $x_1 < x_2$ 时, $y_1 > y_2$. 然后我们找到所有从右上到左下的路径,其中路径的权值和最大的那条路径的权值和就是答案了. 然后我们就可以用 Dp 解决问题了. 我们可以…
好厉害. 注意到到了(i,j)就一定到不了(i-1,j+1),那么可以dp啦.dp[i][j]表示(i,j)右上角都清了的方案数. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1050 using namespace std; long long t,n,m,a[maxn][maxn],dp[maxn][maxn]; int ma…