数据范围:1≤n≤16,1≤m≤16,矩阵中每个元素1≤a[i][j]≤1000,1≤r≤n,1≤c≤m
看到数据范围,行与列的范围只有16,首先想到搜索,枚举取舍,时间复杂度达到O(2^(n+m)) ,时间承受不了
对于多维问题,常见的思路是降维
在枚举行之后,对列可以DP。
在选完行以后,每一列上行与行之间的得分就可以计算了,列与列之间的得分即为两列上横向差值的绝对值,这样就把二维压缩成一维了。
2^m -> m^3 时间复杂度骤减
f[i,j]=f[k,j-1]+lc[k,i]+rc[i]
f[i,j]表示以i列结尾,共j列的最小得分
lc[k,i]表示第k列和第i列的横向的差
rc[i]表示第i列上下元素的差
(是我太笨想不到先搜再DP T_T)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define min(a,b) (a<b?a:b)
using namespace