1 条题解

  • 0
    @ 2025-4-7 21:38:08

    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
    上传者