2016 UESTC Training for Dynamic Programming M - 柱爷抢银行欢庆5.1special 递推
来源:互联网 发布:涡扇15和f119数据对比 编辑:程序博客网 时间:2024/05/23 02:03
M - 柱爷抢银行欢庆5.1special
Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
柱爷抢银行的手段日益熟练。为了欢庆5.1,柱爷准备再花式抢一波银行。
喵蛤蛤城是一个大的矩形方阵,而这方阵是由
当
柱爷最近练成了飞天螺旋大草,所以他决定要抢的银行要形成
其中黑色方块是柱爷要抢钱的银行。
请问柱爷最多能抢多少钱?
Input
第一行两个数
之后
数据保证:
3≤N,M≤500 。−1000≤aij≤1000 。
Output
输出一行一个数,即答案。
Sample input and output
6 50 0 0 0 01 1 1 1 10 0 0 0 11 1 1 0 11 0 0 0 11 1 1 1 1
17
3 31 1 11 0 01 1 1
6
6 6-3 2 0 1 5 -14 -1 2 -3 0 1-5 1 2 4 1 -20 -2 1 3 -1 23 1 4 -3 -2 0-1 2 -1 3 1 2
13
Hint
请注意柱爷不是临阵退缩的人,既然来了,就至少要选择一个格子!(尽管可能会亏钱)
Source
2016 UESTC Training for Dynamic Programming
My Solution
递推k阶的图刚好是k+2阶的图的白色部分 - val[i][j];
所以刚好dp[i][j] = getsum(i, j, i+k-1, j+k-1) - dp[i+1][j+1] - val[i+1][j];
//dp[i+1][j+1] 还是上一个k 的
其中getsum(i, j, i+k-1, j+k-1)可以从二阶前置和得到, d1 - d2 - d3 + d4;
复杂度 O(n^3)
第一次碰到二阶前缀和,随便贴一个我写的版嘿嘿
inline int getsum(int i, int j, int x, int y)
{
return (sum[x][y] - sum[x][j-1] - sum[i-1][y] + sum[i-1][j-1]);
}
void read()
{
for(int i = 0; i <= M; i++) sum[0][i] = 0;
for(int i = 1; i <= N; i++){
s[0] = 0;//这个可以直接放外面
for(int j = 1; j <= M; j++){
scanf("%d", &val[i][j]);
dp[i][j] = val[i][j];
//预处理二阶前缀和
s[j] = s[j-1] + val[i][j];
sum[i][j] = sum[i-1][j] + s[j-1] + val[i][j];
//printf("sum[%d][%d] = %d;", i, j, sum[i][j]);
}
//printf("\n");
}
}
#include <iostream>#include <cstdio>using namespace std;const int maxn = 500 + 8;int val[maxn][maxn], dp[maxn][maxn], sum[maxn][maxn], s[maxn];inline int getsum(int i, int j, int x, int y){ return (sum[x][y] - sum[x][j-1] - sum[i-1][y] + sum[i-1][j-1]);}int main(){ #ifdef LOCAL freopen("a.txt", "r", stdin); #endif // LOCAL int N, M, K; scanf("%d%d", &N, &M); for(int i = 0; i <= M; i++) sum[0][i] = 0; for(int i = 1; i <= N; i++){ s[0] = 0;//这个可以直接放外面 for(int j = 1; j <= M; j++){ scanf("%d", &val[i][j]); dp[i][j] = val[i][j]; //预处理二阶前缀和 s[j] = s[j-1] + val[i][j]; sum[i][j] = sum[i-1][j] + s[j-1] + val[i][j]; //printf("sum[%d][%d] = %d;", i, j, sum[i][j]); } //printf("\n"); } K = min(N, M); int ans = -7*1002; //如果全负数就选3阶了,最多7个 -1000 //k = 1 的时候 dp[i][j] 就是 val[i][j] 了 上面已经处理好了 for(int k = 3; k <= K; k += 2){ for(int i = 1; i + k - 1 <= N; i++){ for(int j = 1; j + k - 1 <= M; j++){ dp[i][j] = getsum(i, j, i+k-1, j+k-1) - dp[i+1][j+1] - val[i+1][j]; //dp[i+1][j+1] 还是上一个k 的 //cout<<dp[i][j]<<endl; ans = max(ans, dp[i][j]); } } } printf("%d", ans); return 0;}
Thank you!
------from ProLights
0 0
- 2016 UESTC Training for Dynamic Programming M - 柱爷抢银行欢庆5.1special 递推
- 2014 UESTC Training for Dynamic Programming M
- 2016 UESTC Training for Dynamic Programming J - 柱爷抢银行II dp单调队列优化
- 2016 UESTC Training for Dynamic Programming L - 柱爷抢银行MkⅣ dp 线段树优化
- 2016 UESTC Training for Dynamic Programming P - 柱爷的矩阵 矩阵、递推
- 2016 UESTC Training for Dynamic Programming(1)
- 2014 UESTC Training for Dynamic Programming
- 2014 UESTC Training for Dynamic Programming F
- 2014 UESTC Training for Dynamic Programming G
- 2014 UESTC Training for Dynamic Programming I
- 2014 UESTC Training for Dynamic Programming J
- 2014 UESTC Training for Dynamic Programming L
- 【cdoj 1356】柱爷抢银行欢庆5.1special 前缀和
- 2016 UESTC Training for Dynamic Programming A - 柱爷与咸鱼神功 0-1背包
- 2016 UESTC Training for Dynamic Programming C - 柱爷的下凡 预处理打表、背包问题
- 2016 UESTC Training for Dynamic Programming D - 柱爷的恋爱 区间dp、记忆化搜索
- 2016 UESTC Training for Dynamic Programming H - 柱爷大战滑稽王 LCS转LIS
- 2016 UESTC Training for Dynamic Programming Q - 柱爷的宝藏 斜率优化
- 2016 UESTC Training for Dynamic Programming L - 柱爷抢银行MkⅣ dp 线段树优化
- u盘修复
- POJ1083 模拟
- React组件的生命周期
- sky_add_digits
- 2016 UESTC Training for Dynamic Programming M - 柱爷抢银行欢庆5.1special 递推
- 将ACCESS数据库迁移到SQLSERVER数据库两种方法
- 2016 UESTC Training for Dynamic Programming N - 柱爷与子序列 这题和N题有些相似之处、用了树状数组
- jquery遍历ajax返回的json数据
- 如何下载stm32系列单片机的固件库(最新版)
- 01_XML DOM 教程
- 报错:constructors not allowed a return type
- java学习笔记5.16
- 02_XML DOM 简介