$ \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. 使用Jenkins集成和自动化打包资料

    1.手把手教你利用Jenkins持续集成iOS项目 http://www.jianshu.com/p/41ecb06ae95f 2.Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 ...

  2. 电商项目面试题 及mysql面试题 太难没啥用

    需要按照功能点把系统拆分,拆分成独立的功能.单独为某一个节点添加服务器.需要系统之间配合才能完成整个业务逻辑.叫做分布式.集群:同一个工程部署到多台服务器上.优点:1.把模块拆分,使用接口通信,降低模 ...

  3. CTE 中字符串拼接

    1>cte语法 1.1>基础语句和递归语句中必须有字段 1.2>最后只能跟一条查询语句 1.3>字符串拼接,要将拼接的字段转成字符串类型,cast(fieldName as n ...

  4. Linux下安装Nginx详细图解教程(一)

    什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,在高连接并发的情况下N ...

  5. [Jenkins] 全局变量

    http://www.360doc.com/content/14/1110/10/7811581_423993429.shtml https://wiki.jenkins.io/display/JEN ...

  6. BWA/BWT 比对软件

    名称    bwa –   Burrows-Wheeler  Alignment Tool 内容摘要描述命令行与选项SAM 比对格式短序列比对注意事项  比对精确性  估计插入大小分布  内存需求  ...

  7. 37 有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位.

    题目:有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位. public class _037NumberOff { public st ...

  8. c#范型

    泛型介绍:范型类和范型方法同事具备可重用性.类型安全和效率,这是非范型类和非范型方法无法具备的. 所谓范型,即通过参数化类型实现同一份代码上操作多种数据类型,范型编程是一种编程范式,它利用“参数化类型 ...

  9. Android 控件在布局中按比例放置[转]

    转自:http://netsky1990.blog.51cto.com/2220666/997452       在Android开发中常用到线性布局LinearLayout对界面进行具体的创建,其中 ...

  10. 大致(主要hadoop)软件下载地址

    jdk-8u181-linux-x64.tar.gz https://www.oracle.com/technetwork/java/javase/downloads/index.html hadoo ...