1 条题解
-
0
C++ :
#include <map> #include <set> #include <stack> #include <cmath> #include <ctime> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #ifndef unix #define lld "%I64d" #define llu "%I64u" #else #define lld "%lld" #define llu "%llu" #endif #define FOR(a,b,c) for(int (a)=b;(a)<=(c);++(a)) #define FORD(a,b,c) for(int (a)=b;(a)>=(c);--(a)) #define FORV(a,t,b) for(vector<t>::iterator a=b.begin();a!=b.end();++a) #define MAX(a,b) a=max(a,b) #define MIN(a,b) a=min(a,b) #define BLA printf("\n") #define pb push_back #define mp make_pair #define gc getchar #define RT return #define BB second #define AA first #define bk break #define LINF 0x3f3f3f3f3f3f3f3fll #define INF 0x3f3f3f3f #define eps 1e-8 #define DINF 1e20 //#define Generator typedef long long ll; typedef unsigned ui; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll ,ll > pll; const int MAXN= 0; const int MOD = 0; template <class T> inline void CLR(T &g) {T t;swap(t,g);} template <class T> inline void CLR(T &g,int a){memset(g,a,sizeof g);} template <class T> inline void CPY(T &a,T &b) {memcpy(a,b,sizeof a);} template <class T> inline bool inr(T a,T b,T c) {RT (a>=b && a<=c);} inline int acc(int a,int b) {RT !!(a & (1<<b-1));} inline int fil(int a,int b,int c) {RT a & ~(1<<b-1) | (1<<b-1)*c;} int N, M, K, Q, R, C; int a[20][20]; int f[20][20];//f[i][j]表示 已经选择i列 上一列是j int sum[20], d[20], csum[20][20]; int main(){ #ifndef Generator #ifndef ONLINE_JUDGE freopen("submatrix.in" ,"r",stdin ); freopen("submatrix.out","w",stdout); #endif #endif #ifdef Generator freopen("input.txt","w",stdout); srand((ui)time(NULL)); #endif int T, o=0; scanf("%d%d%d%d", &N, &M, &R, &C); FOR(i, 1, N) FOR(j, 1, M) scanf("%d", &a[i][j]); int ans=INF; FOR(i, 1, (1<<N)-1){//枚举哪些行被选入矩阵 int cnt=0; FOR(j, 1, N) if (acc(i, j)) d[++cnt]=j; if (cnt != R) continue; FOR(j, 1, M){ sum[j]=0; FOR(k, 1, R-1) sum[j] += abs(a[d[k]][j]-a[d[k+1]][j]); } FOR(j, 1, M) FOR(k, j+1, M){ csum[j][k]=0; FOR(l, 1, R) csum[j][k] += abs(a[d[l]][j]-a[d[l]][k]); } CLR(f, 0x3f); f[0][0]=0; FOR(j, 1, C){ FOR(k, 1, M){ int tot=0; FOR(l, 0, k-1) MIN(f[j][k], f[j-1][l]+csum[l][k]+sum[k]); } } FOR(j, 1, M) MIN(ans, f[C][j]); } printf("%d\n", ans); RT 0; }
- 1
信息
- ID
- 1951
- 时间
- 5000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者