第一次使用上交的online judge,都翻译成了中文的,也还不错。只是没有提示使用环境的,我写的程序在VS2010下编译正确,但提交竟然报错,后来限制了一些。
1000题就是计算两个整数的相加;
1001题是判断一个列表中每个元素与一个标准值的大小,求出其中满足小于等于关系的个数;
1002题可以说是最大化问题。
我最初的想法是,得到大矩形中每个小矩形的面积,求出所有小矩形面积中的最大者。这样的程序中,输入复杂度为O(L*W),遍历每个小矩形的左上角顶点,并计算出小矩形面积,求出当前最大面积的复杂度为O((L-r)*(W-c)*r*c);
后来下午想了下,想到了字符串匹配里面的Rabin-Karp算法,在计算一个新的字符串的值的时候,减去前一个字符串的第一个元素代表的值,加上新的字符串的最后一个字符串代表的值,于是在计算矩形面积的时候,只计算第一个小矩形面积,在计算后面的矩形时,利用前面一个矩阵,减去前面一个矩阵所有最左一列的值,加上新的小矩形的最右一列的值;在换到新一行的时候,利用上一行第一个来计算;复杂度为O((L-r)*(W-c)*r);
后来在车上,又想到的图像的卷积,后来在输入完矩阵后,计算卷积矩阵(在左侧增加一列全0,在上方增加一行全0),然后对于每个可能的小矩形只要三次计算就可以得到值了,复杂度为O((L-r)*(W-c));
// Compute the max productint area=0, currentMax=0;for (register int i=0;i<=row-r;i++){for (register int j=0;j<=col-c;j++){area= convolution[i+r][j+c]-convolution[i][j+c]-convolution[i+r][j]+convolution[i][j];if (area>currentMax){currentMax=area;}}}
看来遇到问题必然要弄清问题的描述,想要求解什么; 然后想一个能直接解决问题的方法,或者找现有算法里面的能符合解决问题的;最后可以分析问题的一些固有性质,提出针对该问题的特定解法。
