BZOJ 1177 [Apio2009]Oil(递推)

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1177

【题目大意】

  给出一个矩阵,从中选出3个k*k且不相交的矩阵,使得其总和最大

【题解】

  只要处理四个方向的前缀最大值,就可以分类比较得到答案。

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define red(i,a,b) for(int i=b;i>=a;i--)
const int N=2600;
int n,m,k,x,s[N][N],a[N][N],b[N][N],c[N][N],d[N][N],ans=0;
int main(){
    scanf("%d%d%d",&n,&m,&k);
    rep(i,1,n)rep(j,1,m){scanf("%d",&x);s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+x;}
    red(i,k,n)red(j,k,m)s[i][j]-=s[i-k][j]+s[i][j-k]-s[i-k][j-k];
    rep(i,k,n)rep(j,k,m)a[i][j]=max(s[i][j],max(a[i-1][j],a[i][j-1]));
    rep(i,k,n)red(j,k,m)b[i][j]=max(s[i][j],max(b[i-1][j],b[i][j+1]));
    red(i,k,n)rep(j,k,m)c[i][j]=max(s[i][j],max(c[i+1][j],c[i][j-1]));
    red(i,k,n)red(j,k,m)d[i][j]=max(s[i][j],max(d[i+1][j],d[i][j+1]));
    rep(i,k,n-k)rep(j,k,m-k)ans=max(ans,a[i][j]+b[i][j+k]+c[i+k][m]);
    rep(i,k,n-k)rep(j,k+k,m)ans=max(ans,b[i][j]+d[i+k][j]+a[n][j-k]);
    rep(i,k+k,n)rep(j,k,m-k)ans=max(ans,c[i][j]+d[i][j+k]+a[i-k][m]);
    rep(i,k,n-k)rep(j,k,m-k)ans=max(ans,a[i][j]+c[i+k][j]+b[n][j+k]);
    rep(i,k,n)rep(j,k+k,m-k)ans=max(ans,s[i][j]+a[n][j-k]+b[n][j+k]);
    rep(i,k+k,n-k)rep(j,k,m)ans=max(ans,s[i][j]+a[i-k][m]+c[i+k][m]);
    printf("%d\n",ans);
}

  

时间: 2024-10-15 09:39:57

BZOJ 1177 [Apio2009]Oil(递推)的相关文章

[Bzoj 1177][Apio2009] Oil 前缀和+递推

1177: [Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MB Submit: 1569 Solved: 632 [Submit][Status][Discuss] Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质调查局有关于Navalur土地石油储量的估测数据.这些数据表示为M×N个非负整

BZOJ 1002 FJOI2007 轮状病毒 递推+高精度

题目大意:轮状病毒基定义如图.求有多少n轮状病毒 这个递推实在是不会--所以我选择了打表找规律 首先执行下面程序 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 110 using namespace std; struct abcd{ int to,next; bool ban; }table[M<<2]; int head[

BZOJ 1002: [FJOI2007]轮状病毒 递推/基尔霍夫矩阵树定理

f[n]=3*f[n-1]-f[n-2]+2 1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2959  Solved: 1644 [Submit][Status][Discuss] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Outpu

【BZOJ 1177】 [Apio2009]Oil

1177: [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 1044  Solved: 404 [Submit][Status][Discuss] Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质调查局有关于Navalur土地石油储量的估测数据.这些数据表示为M×N个非

BZOJ 1002 + SPOJ 104 基尔霍夫矩阵 + 一个递推式。

BZOJ 1002 高精度 + 递推 f[1] = 1; f[2] = 5; f[i] = f[i - 1] * 3 - f[i - 2] + 2; SPOJ 104 裸 + 不用Mod 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 7 using namespace std;

BZOJ 1088 扫雷Mine (递推)

题解:如果确定了第一排前两个数,那么剩下的数是唯一确定的,所以只要分情况讨论即可. #include <cstdio> #include <cstring> int n,a[10010],s[10010]; int ans(int x){ memset(a,0,sizeof a); if(x==1)a[1]=1; if(x==2)a[2]=1; if(x==3)a[1]=a[2]=1; for(int i=2;i<=n-1;i++){ a[i+1]=s[i]-a[i]-a[i

BZOJ 1089 严格n元树 (递推+高精度)

题解:用a[i]表<=i时有几种树满足度数要求,那么这样就可以递归了,a[i]=a[i-1]^n+1.n个节点每个有a[i-1]种情况,那么将其相乘,最后加上1,因为深度为0也算一种.那么答案就是a[n]-a[n-1].然后就是高精度的问题了,发现很久没有现码高精度没手感了,连高进度加法进位都出了些问题,需要特别注意. #include <cstdio> #include <cstring> #include <algorithm> using namespace

【BZOJ】1088: [SCOI2005]扫雷Mine(递推)

http://www.lydsy.com/JudgeOnline/problem.php?id=1088 脑残去想递推去了... 对于每一个第二列的格子,考虑多种情况,然后转移.....QAQ 空间可以降到O(1)...我就不优化了.. 至于题解说的枚举第一行...orz完全想不到. 做法就是:(好麻烦,不说了...就是对应三个格子的状态然后转移 #include <cstdio> #include <cstring> #include <cmath> #include

值得一做》关于数学与递推 BZOJ1002 (BZOJ第一页计划)(normal+)

什么都不说先甩题目 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒   Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 S