首页 > 其他分享 >P4850 [IOI2009] Raisins 题解

P4850 [IOI2009] Raisins 题解

时间:2023-08-05 09:11:35浏览次数:98  
标签:51 rx IOI2009 int 题解 Raisins 矩阵 lx ly

前言:

IOI 还出这样的纯记忆化搜索题?还是 T4?真令人难以置信。

题意:

题目传送门

一个 N×M 的矩阵,对于任意一个子矩阵,只能横着或竖着分割,并且分割一次的价值为改子矩阵的元素之和,现要将该矩阵分割成 1×1 的方格,求最小的分割总价值之和。

思路:

看到这是个最优化的题,且数据范围很小,可以用搜索。

并且,对于一个相同的子矩阵,可能会搜到多次,由于它的最优值是一定的,所以可以用记忆化优化一下。

总结出搜索思路:

  1. 枚举是竖着切和横着切,以及切的位置。

  2. 继续递归,计算出切割后两个更小的子矩阵的价值,并求出所有切割方案中的最优值。

  3. 当搜索到的子矩阵大小为 1,直接返回。

  4. 当前子矩阵搜过,返回得出的最优值。

  5. 用最优值再加上当前子矩阵本身的和,即为该子矩阵的最优值。

对于子矩阵的和,可以用二维前缀和计算,优化时间。不知道二维前缀和的同学可以参考我的这篇博客

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[51][51];//读入的矩阵 
int ans[51][51][51][51];//记忆化,记录最优值 
bool f[51][51][51][51];//记忆化,记录搜没搜过 
inline int dfs(int lx,int ly,int rx,int ry)
{
	if(f[lx][ly][rx][ry]) return ans[lx][ly][rx][ry];//搜过直接返回最优值 
	f[lx][ly][rx][ry]=1;//否则先标记一下 
	if(lx==rx&&ly==ry)//大小为1,不需再切,直接返回 
	{
		ans[lx][ly][rx][ry]=0;
		return 0;
	}
	for(int i=lx;i<rx;i++)//横着切,以及切的位置 
	{
		ans[lx][ly][rx][ry]=min(ans[lx][ly][rx][ry],dfs(i+1,ly,rx,ry)+dfs(lx,ly,i,ry));	//递归算值,并维护最优值 
	} 
	for(int i=ly;i<ry;i++)//竖着切,以及切的位置 
	{
		ans[lx][ly][rx][ry]=min(ans[lx][ly][rx][ry],dfs(lx,i+1,rx,ry)+dfs(lx,ly,rx,i));//同上 
	}
	ans[lx][ly][rx][ry]+=a[rx][ry]+a[lx-1][ly-1]-a[lx-1][ry]-a[rx][ly-1];//加上子矩阵自身,这里用了二维前缀和优化 
	return ans[lx][ly][rx][ry];//返回 
}
int main()
{
	cin>>n>>m;
	memset(ans,0x3f,sizeof(ans));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
			a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];//二维前缀和预处理 
		}	
	}
	printf("%d\n",dfs(1,1,n,m));	
	return 0;
}

写题解不易,点个赞呗。

标签:51,rx,IOI2009,int,题解,Raisins,矩阵,lx,ly
From: https://www.cnblogs.com/zhangxiao666qwq/p/luogu-P4850.html

相关文章

  • P9437 『XYGOI round1』一棵树 题解
    赛时一眼换根dp,然后调调调了大概1h+。题目传送门什么是换根dp在大多数树形dp中,我们只考虑对根的贡献,而一部分题目需要算出对所有点的贡献,一个比较显然的做法是对每个点都跑一次树形dp,但是大大增加了时间复杂度,是我们不能接受的。树形dp中的换根dp问题又被称为二次扫......
  • 洛谷 P7911 [CSP-J 2021] 网络连接 题解
    写在前面一道普及级别的题目。CSP-J全国统一命题2021年第三题。本题解来自于一位真正的大佬。传送门https://www.luogu.com.cn/blog/xyf007/solution-p7911。题面信息来源于洛谷。请访问https://www.luogu.com.cn/problem/P7911。声明:本题解非商业用途,一切侵权行为请联系作......
  • We Were Both Childrent 题解
    将一个好理解的方法。题目说有n只青蛙,每只青蛙初始都在0位置,每秒会往前跳a_i。你可以在位置1到n设置一个陷阱,陷阱会抓住经过它的所有青蛙,求你最多能抓住多少青蛙。很简单,只要枚举质因数并判断是否合法即可。intn,ans=0;cin>>n;memset(cnt,0,sizeofcnt)......
  • Balanced Round 题解
    原题链接。题目大意给你一些数,问至少删掉多少数后两两不大于k。我们可以画图理解。最后我们取max(2,1),由于我们求的是合法的,所以还得用长度减去2,最终答案就是2。根据图我们就知道可以遍历一遍数组,用t记录下最长合法序列长度,最后用n-t即可。代码#include<bits/......
  • CF1491B Minimal Cost 题解
    调了两个多小时终于过了,交一发题解。题目分析如果你认真读题就会发现,这道题看似有很多种情况,但障碍的移动方式其实只有几种。如果当所有障碍物都在一列时,可以将某一个障碍水平移动一格,再垂直移动一格或者水平移动两格,那么答案就是v+min(u,v)。当有通路时,则无需移动,答案就是......
  • CF1682B AND Sorting 题解
    首先,我们按照题意,可以用0来作为中间的一个数来交换其他两个数,这种元素肯定是有的,那就是所有不在正确位置上的所有数的AND值,我们可以开一个数组a来模拟这个过程,a_i&a_j=X,那这里的X就起到我们的0的作用了。代码:#include<bits/stdc++.h>#defineintlonglongusin......
  • [NOI2021] 路径交点 题解
    [NOI2021]路径交点题解题意给定一张\(k\)层的有向图,第\(i\)层有\(n_i\)​个顶点,第​\(1\)层与第\(k\)​层顶点数相同。对于第​​\(j\)\((1\leqj<k)\)层的顶点,只会连向第\(j+1\)层的顶点。没有边连向第\(1\)层的顶点,第\(k\)层的顶点不会向其他顶点连边......
  • [Luogu P8744] 左孩子右兄弟 题解
    题目大意给定一棵节点个数为\(N\)的多叉树,求其通过"左孩子右兄弟"表示法转化成的二叉树,高度最高是多少。解决思路首先分辨出此题目是树状DP,并了解"左孩子右兄弟"表示法的转换方式,便开始考虑DP的状态转移方程。状态由于每个节点由\(1\)至\(N\)编号,那么就使用\(dp_{k......
  • 【题解】[2023牛客多校] Distance
    题目传送门:[2023牛客多校]Distance题意对于任意两个元素个数相同的set:A、B,每次可以执行以下两种操作之一:将A中的任意元素加一将B中的任意元素加一\(C(A,B)\)含义为将\(A、B\)改变为完全相同的set所需要花费的最小次数;初始给你两个set:\(S、T\),计算\(\sum_{A\subs......
  • P4795 [BalticOI 2018] 基因工程 题解
    题目传送门:Click。蒟蒻看见这道题,想了足足一个小时,过后顿有所悟,故作此篇。首先,看到题目,光是数据就已经达到了\(\operatorname{O}(nm)\)的级别,再看一看数据范围:\(3\leqn,m\leq4,100\)。显然是一道时间复杂度为\(\operatorname{O}(n,m)\)级别的题目。本蒟蒻首先观察了样......