【DP】 cf 321E
2015-11-02 14:18
393 查看
用四边形优化一下dp即可。。。。
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxm = 808; const int maxn = 4004; const int INF = 0x3f3f3f3f; int f[maxm][maxn]; int s[maxm][maxn]; int a[maxn][maxn]; int n, m; void read(int &x) { x = 0; char ch = getchar(); while(ch == ' ' || ch == '\n') ch = getchar(); while(ch != ' ' && ch != '\n') x = x * 10 + ch - '0', ch = getchar(); } int calc(int i, int j) { return a[j][j] - a[i-1][j] - a[j][i-1] + a[i-1][i-1]; } void work() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) read(a[i][j]); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) a[i][j] += a[i][j-1]; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) a[i][j] += a[i-1][j]; memset(f, INF, sizeof f); f[0][0] = 0; for(int i = 1; i <= m; i++) for(int j = n; j >= 1; j--) { for(int k = s[i-1][j]; k <= (j == n ? n : s[i][j+1]) && k < j; k++) { if(f[i][j] > f[i-1][k] + calc(k+1, j)) { f[i][j] = f[i-1][k] + calc(k+1, j); s[i][j] = k; } } } printf("%d\n", f[m] / 2); } int main() { //freopen("data", "r", stdin); work(); return 0; }
相关文章推荐
- SPI总线协议及SPI时序图详解
- 测试工具ab.exe 的使用
- 怎么用软件代码判断CPU是大端模式还是小端模式
- 制作U盘启动来安装Linux系统的具体方法(图文)
- CLRS 8.4桶排序
- servU服务器连接不上问题的解决
- java编译、编码、语言设置
- service
- 第二个wp app上架-- owl Bus
- 数据结构-链式线性表基本操作实现
- win7 mysql 免安装版 配置注册问题
- startactivityforresult
- UESTC 757 棋盘 博弈、策略
- Android studio自动安装releaseAPK
- Codesys——TON和TOF的使用方法
- 《从零开始学Swift》学习笔记(Day 30)——选择类还是结构体呢?
- 媒体类型和字符集
- No matching provisioning profiles found
- 度量快速开发平台中DataTable.Select的一些其他用法
- linux中内存使用,swap,cache,buffer的含义