$ \color{#0066ff}{ 题目描述 }$

普罗夫迪夫的著名巧克力大师Bonny需要切开一板带有葡萄干的巧克力。巧克力是一个包含许多相同的方形小块的矩形。小块沿着巧克力的边排列成n行m列,即共有nm块。每个小块上有1个或多个葡萄干,没有葡萄干在小块的边上或者跨过两个小块。 最开始,巧克力是一整块。Bonny需要把它切成上述的nm个独立的小块。因为Bonny很忙,她需要她的助手Sly peter帮她切。Peter只能从一端到另一端切直线并且他要为他的每一刀得到报酬。Bonny手头没有钱,但是她有足够的葡萄干,所以她提出用葡萄干付给peter。Sly peter同意接受葡萄干,但是有下面的条件:每次他把给定的一块巧克力切成两小块,他都要得到和那块给定的巧克力上葡萄干数目相同的葡萄干。 Bonny想要付给peter尽可能少的葡萄干。她知道这nm个小块中每一个小块上葡萄干的数目。她可以选择递给peter的巧克力的顺序,也可以告诉peter如何切(横切还是竖切)以及从哪里切。请告诉Bonny如何把巧克力切成一个个独立的小块。使她能够付给Sly peter尽可能少的葡萄干。

任务 写一个程序,给定每个小块上葡萄干的数目,计算Bonny要付给Sly peter的最少的葡萄干的数目。

\(\color{#0066ff}{输入格式}\)

你的程序必须从标准输入中读取下列数据:

第一行包含整数n和m,以一个空格隔开。

接下来的n行描述了每个小块上葡萄干的数目。这n行中第kth行描述的是第kth行小块巧克力。每行包含m个整数,分别以一个空格隔开。这些整数描述的是该行从左到右的小块。第kth行的第pth个整数表示位于第kth行第pth列的小块上的葡萄干数目。

\(\color{#0066ff}{输出格式}\)

你的程序必须向标准输出写入一行,该行包含一个整数;Bonny要付给Sly peter的最少的葡萄干的数目。

评分规则 有25分的评测数据,n,m<=7。

\(\color{#0066ff}{输入样例}\)

2 3
2 7 5
1 9 5

\(\color{#0066ff}{输出样例}\)

77

\(\color{#0066ff}{数据范围与提示}\)

1<=n,m<=50 巧克力两条边上小块的数目

1<=k,p<=1,000 第kth行第pth列的小块上的葡萄干数目

\(\color{#0066ff}{题解}\)

一看这题,先搜索暴力有25pts,然后发现可以记忆化,然后。。。就A了。。这。。。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
template<class T> bool chkmax(T &a, const T &b) { return a < b? a = b, 1 : 0; }
template<class T> bool chkmin(T &a, const T &b) { return b < a? a = b, 1 : 0; }
const int inf = 0x7fffffff;
const int maxn = 1050;
int n, m;
int s[maxn][maxn], f[55][55][55][55];
int getsum(int x, int y, int xx, int yy) {
return s[xx][yy] - s[x - 1][yy] - s[xx][y - 1] + s[x - 1][y - 1];
}
int work(int x, int y, int xx, int yy) {
if(f[x][y][xx][yy]) return f[x][y][xx][yy];
if(x == xx && y == yy) return 0;
int ans = inf;
for(int i = x; i < xx; i++) chkmin(ans, work(x, y, i, yy) + work(i + 1, y, xx, yy));
for(int i = y; i < yy; i++) chkmin(ans, work(x, y, xx, i) + work(x, i + 1, xx, yy));
return f[x][y][xx][yy] = ans + getsum(x, y, xx, yy);
}
int main() {
n = in(), m = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + in();
printf("%d\n", work(1, 1, n, m));
return 0;
}

P4850 [IOI2009]葡萄干raisins 记忆化搜索的更多相关文章

  1. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  2. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

  3. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. zoj 3644(dp + 记忆化搜索)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...

  5. loj 1044(dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...

  6. DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects

    题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...

  7. HDU1978 记忆化搜索

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  8. bzoj4562: [Haoi2016]食物链--记忆化搜索

    这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有 ...

  9. 数位dp/记忆化搜索

    一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an  ...

随机推荐

  1. Opencv Canny

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  2. eclipse基础环境配置和svn、maven的配置以及maven的安装

    安装eclipse和基础配置 第一步:解压eclipse安装包,直接解压就可以,绿色版安装 第二步:启动eclipse,注意这里的eclipse需要依赖jdk,并且版本需要匹配,否则启动会出 现问题. ...

  3. fseek效率

    http://www.zhihu.com/question/36675524?sort=created C++怎样读取文件才有最快的速度 获取文件大小,然后分配相应大小的内存,一次性读取文件到此内存 ...

  4. [原创]COCOS2DX 3.8 增加protobuf为external库

    此处为记录防止忘记,最近使用COCOS练习一些新的库,所以需要把PROTOBUF编译进去,看上去很麻烦,这里记录一下,以防忘记. 首先下载protobuf 2.5.0版本,下载地址请自行百度. 准备工 ...

  5. 工作流系统webservice服务

    http://blog.csdn.net/zhengzhb/article/details/7477616

  6. 设计模式(java)--观察者模式

    转自:卡奴达摩http://blog.csdn.net/zhengzhb/article/details/7471978?reload#reply 定义:定义对象间一种一对多的依赖关系,使得当每一个对 ...

  7. java Concurrent包学习笔记(四):BlockingQueue

    一.BlockingQueue概述 1.阻塞的含义 BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞.被阻塞的情况主要有如下两种: ,当一个线程对 ...

  8. Samba文件服务器安装配置

    很久都没有更新博客了,人要学好难,跟着学坏容易,这个其实是我一直以来不明白的地方.如果,能反过来,应该是很多人求之不得的美事吧.说远了,我就是这种一放松下来,就容易堕落的一份子. 最近也是工作的原因, ...

  9. jquery cookie用法

    jquery cookie用法(获取cookie值,删除cookie) cookie在jquery中有指定的cookie操作类,下面我先来介绍我们在使用cookie操作类时的一些问题,然后介绍正确的使 ...

  10. 每天多学一个Linux命令--man

    今天学习的是“有问题,找男人”.man是manual(操作说明)的简写.它提供强大的帮助文档,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. 第一列代表的是章节代号,第二列代表的是 ...