C++天空

cpp_stu2's Land

置顶随笔

[置顶]关于rock的一些思考

对rock的一些思考与问题 题目 宝库通道(Rock) 探宝的旅程仍然继续中,由于你的帮助,小可可成功点燃了灯阵,避过了许多致命的陷阱,终于来到了宫殿的正厅中。大厅的地面是由一块块大小一致的正方形石块组成的,这些石块分为黑、白两色,组成了一个m*n的矩形,在其中一个石块的下面就是通往藏宝库的通道。小可可不可能一个一个石块的尝试,因为有些石块安装了机关,一碰就会触发,整个宫殿也随之倒塌。根据藏宝图记载,通道在某一特定的区域中,这个区域是一个由数个石块组成的面积不为0的小矩形,它的四条边与大厅地面的边平行。如果对整个大厅地面任意划分矩形,那么在所有矩形中,这个区域的黑色石块数目减去白色石块数目所得的差是最大的。 小可可希望和你分工,由他来选择区域,你来计算黑、白两色石块的数目差S。这样就能快速而准确的确认通道所在的区域。藏宝图上说这个区域中的石块都没有安装机关,只要确定了区域,就一定能找到通道。宝藏就在眼前了,加油吧! (假设用1表示黑色石块,用0表示白色石块) 输入:输入文件的第一行为两个整数m,n (1<=m,n<=400). 以下m行,每行n个字符,每个字符都是0或1。 输出:输出文件仅一个数,表示所有可能的区域中S值(见前文描述)最大的一个,输出这个值即可。 样例: 输入: 3 4 1011 1111 1111 输出: 10 四重循环: 四重循环比较简单,即求 area(x1,x2,y1,y2)=area(0,0,x2,y2)-area(0,0,x1,y2)-area(0,0, x2,y1)+area(0,0, x1, y2) 三重循环 三重循环使用dp 但是我用了三位数组可能超空间。 提问 1. 我用三重循环时用的是“竖穷举,横dp”,我想要达到“横竖都要dp”,怎么办? 2. 我的程序在下面 三重循环 #include using namespace std; ifstream fin ("rock.in"); ofstream fout ("rock.out"); int m,n; int maxx=0; int a[400][400]; int b[400][400][400]; void ask1(int x,int y,int lng) { int sum=0; for (int i=y;i<=lng;i++) sum+=a[x][i]; b[x][y][lng]=sum; } void ask2(int x,int y,int lng) { int now=0; int maxj=0; for (int j=x;jmaxj) maxj=now; else if (now<0) now=0; } if (maxj>maxx) maxx=maxj; } int main (void) { fin>>m>>n; char tmp; for (int i=0;i>tmp; a[i][j]=(tmp=='0')?-1:1; } for (int x=0;x using namespace std; ifstream fin ("rock.in"); ofstream fout ("rock.out"); int palace[400][400]={0},b[400][400]={0}; int main (void) { long max=0; int N,M; fin>>N>>M; for (int i=0;i>a; palace[i][j]=a-'0'; if (palace[i][j]==0) palace[i][j]=-1; } for (int i=0;imax) max=now; } fout< posted @ 2007-06-30 11:00 姜雨生 阅读(265) | 评论 (0)编辑 收藏

2007年6月30日

关于rock的一些思考

对rock的一些思考与问题 题目 宝库通道(Rock) 探宝的旅程仍然继续中,由于你的帮助,小可可成功点燃了灯阵,避过了许多致命的陷阱,终于来到了宫殿的正厅中。大厅的地面是由一块块大小一致的正方形石块组成的,这些石块分为黑、白两色,组成了一个m*n的矩形,在其中一个石块的下面就是通往藏宝库的通道。小可可不可能一个一个石块的尝试,因为有些石块安装了机关,一碰就会触发,整个宫殿也随之倒塌。根据藏宝图记载,通道在某一特定的区域中,这个区域是一个由数个石块组成的面积不为0的小矩形,它的四条边与大厅地面的边平行。如果对整个大厅地面任意划分矩形,那么在所有矩形中,这个区域的黑色石块数目减去白色石块数目所得的差是最大的。 小可可希望和你分工,由他来选择区域,你来计算黑、白两色石块的数目差S。这样就能快速而准确的确认通道所在的区域。藏宝图上说这个区域中的石块都没有安装机关,只要确定了区域,就一定能找到通道。宝藏就在眼前了,加油吧! (假设用1表示黑色石块,用0表示白色石块) 输入:输入文件的第一行为两个整数m,n (1<=m,n<=400). 以下m行,每行n个字符,每个字符都是0或1。 输出:输出文件仅一个数,表示所有可能的区域中S值(见前文描述)最大的一个,输出这个值即可。 样例: 输入: 3 4 1011 1111 1111 输出: 10 四重循环: 四重循环比较简单,即求 area(x1,x2,y1,y2)=area(0,0,x2,y2)-area(0,0,x1,y2)-area(0,0, x2,y1)+area(0,0, x1, y2) 三重循环 三重循环使用dp 但是我用了三位数组可能超空间。 提问 1. 我用三重循环时用的是“竖穷举,横dp”,我想要达到“横竖都要dp”,怎么办? 2. 我的程序在下面 三重循环 #include using namespace std; ifstream fin ("rock.in"); ofstream fout ("rock.out"); int m,n; int maxx=0; int a[400][400]; int b[400][400][400]; void ask1(int x,int y,int lng) { int sum=0; for (int i=y;i<=lng;i++) sum+=a[x][i]; b[x][y][lng]=sum; } void ask2(int x,int y,int lng) { int now=0; int maxj=0; for (int j=x;jmaxj) maxj=now; else if (now<0) now=0; } if (maxj>maxx) maxx=maxj; } int main (void) { fin>>m>>n; char tmp; for (int i=0;i>tmp; a[i][j]=(tmp=='0')?-1:1; } for (int x=0;x using namespace std; ifstream fin ("rock.in"); ofstream fout ("rock.out"); int palace[400][400]={0},b[400][400]={0}; int main (void) { long max=0; int N,M; fin>>N>>M; for (int i=0;i>a; palace[i][j]=a-'0'; if (palace[i][j]==0) palace[i][j]=-1; } for (int i=0;imax) max=now; } fout< posted @ 2007-06-30 11:00 姜雨生 阅读(265) | 评论 (0)编辑 收藏

仅列出标题  
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(1)

随笔档案

文章档案

搜索

最新评论