日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P2258 子矩阵

發(fā)布時(shí)間:2025/3/15 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2258 子矩阵 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

給出如下定義:

  • 子矩陣:從一個(gè)矩陣當(dāng)中選取某些行和某些列交叉位置所組成的新矩陣(保持行與列的相對(duì)順序)被稱(chēng)為原矩陣的一個(gè)子矩陣。
  • 例如,下面左圖中選取第 222 、 444 行和第 222 、 444 、 555 列交叉位置的元素得到一個(gè) 2×32 \times 32×3 的子矩陣如右圖所示。

    9 3 3 3 9

    9 4 8 7 4

    1 7 4 6 6

    6 8 5 6 9

    7 4 5 6 1

    的其中一個(gè) 2×32 \times 32×3 的子矩陣是

    4 7 4

    8 6 9

  • 相鄰的元素:矩陣中的某個(gè)元素與其上下左右四個(gè)元素(如果存在的話(huà))是相鄰的。

  • 矩陣的分值:矩陣中每一對(duì)相鄰元素之差的絕對(duì)值之和。

  • 本題任務(wù):給定一個(gè) nnn 行 mmm 列的正整數(shù)矩陣,請(qǐng)你從這個(gè)矩陣中選出一個(gè) rrr 行 ccc 列的子矩陣,使得這個(gè)子矩陣的分值最小,并輸出這個(gè)分值。

    (本題目為2014NOIP普及## 題目描述

    給出如下定義:

  • 子矩陣:從一個(gè)矩陣當(dāng)中選取某些行和某些列交叉位置所組成的新矩陣(保持行與列的相對(duì)順序)被稱(chēng)為原矩陣的一個(gè)子矩陣。
  • 例如,下面左圖中選取第 222 、 444 行和第 222 、 444 、 555 列交叉位置的元素得到一個(gè) 2×32 \times 32×3 的子矩陣如右圖所示。

    9 3 3 3 9

    9 4 8 7 4

    1 7 4 6 6

    6 8 5 6 9

    7 4 5 6 1

    的其中一個(gè) 2×32 \times 32×3 的子矩陣是

    4 7 4

    8 6 9

  • 相鄰的元素:矩陣中的某個(gè)元素與其上下左右四個(gè)元素(如果存在的話(huà))是相鄰的。

  • 矩陣的分值:矩陣中每一對(duì)相鄰元素之差的絕對(duì)值之和。

  • 本題任務(wù):給定一個(gè) nnn 行 mmm 列的正整數(shù)矩陣,請(qǐng)你從這個(gè)矩陣中選出一個(gè) rrr 行 ccc 列的子矩陣,使得這個(gè)子矩陣的分值最小,并輸出這個(gè)分值。

    (本題目為2014NOIP普及T4)

    輸入輸出格式

    輸入格式:

    第一行包含用空格隔開(kāi)的四個(gè)整數(shù) n,m,r,cn,m,r,cn,m,r,c ,意義如問(wèn)題描述中所述,每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開(kāi)。

    接下來(lái)的 nnn 行,每行包含 mmm 個(gè)用空格隔開(kāi)的整數(shù),用來(lái)表示問(wèn)題描述中那個(gè) nnn 行 mmm 列的矩陣。

    輸出格式:

    一個(gè)整數(shù),表示滿(mǎn)足題目描述的子矩陣的最小分值。

    輸入輸出樣例

    輸入樣例#1: 復(fù)制

    5 5 2 3
    9 3 3 3 9
    9 4 8 7 4
    1 7 4 6 6
    6 8 5 6 9
    7 4 5 6 1

    輸出樣例#1: 復(fù)制

    6

    輸入樣例#2: 復(fù)制

    7 7 3 3
    7 7 7 6 2 10 5
    5 8 8 2 1 6 2
    2 9 5 5 6 1 7
    7 9 3 6 1 7 8
    1 9 1 4 7 8 8
    10 5 9 1 1 8 10
    1 3 1 5 4 8 6

    輸出樣例#2: 復(fù)制

    16

    說(shuō)明

    【輸入輸出樣例1說(shuō)明】

    該矩陣中分值最小的 222 行 333 列的子矩陣由原矩陣的第 444 行、第 555 行與第 111 列、第 333 列、第 444 列交叉位置的元素組成,為

    6 5 6

    7 5 6

    ,其分值為:

    |6?5| + |5?6| + |7?5| + |5?6| + |6?7| + |5?5| + |6?6| =6。

    【輸入輸出樣例2說(shuō)明】

    該矩陣中分值最小的3行3列的子矩陣由原矩陣的第 444 行、第 555 行、第 666 行與第 222 列、第 666 列、第 777 列交叉位置的元素組成,選取的分值最小的子矩陣為

    9 7 8
    9 8 8
    5 8 10

    【數(shù)據(jù)說(shuō)明】

    對(duì)于 50%50%50% 的數(shù)據(jù), 1≤n≤12,1≤m≤121 ≤ n ≤ 12,1 ≤ m ≤ 121≤n≤12,1≤m≤12 ,矩陣中的每個(gè)元素 1≤aij≤201 ≤ a_{ij} ≤ 201≤aij?≤20 ;

    對(duì)于 100%100%100% 的數(shù)據(jù), 1≤n≤16,1≤m≤161 ≤ n ≤ 16,1 ≤ m ≤ 161≤n≤16,1≤m≤16 ,矩陣中的每個(gè)元素 1≤aij≤1,000,1≤r≤n,1≤c≤m1 ≤ a_{ij} ≤ 1,000,1 ≤ r ≤ n,1 ≤ c ≤ m1≤aij?≤1,000,1≤r≤n,1≤c≤m 。T4)

    輸入輸出格式

    輸入格式:

    第一行包含用空格隔開(kāi)的四個(gè)整數(shù) n,m,r,cn,m,r,cn,m,r,c ,意義如問(wèn)題描述中所述,每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開(kāi)。

    接下來(lái)的 nnn 行,每行包含 mmm 個(gè)用空格隔開(kāi)的整數(shù),用來(lái)表示問(wèn)題描述中那個(gè) nnn 行 mmm 列的矩陣。

    輸出格式:

    一個(gè)整數(shù),表示滿(mǎn)足題目描述的子矩陣的最小分值。

    輸入輸出樣例

    輸入樣例#1: 復(fù)制

    5 5 2 3
    9 3 3 3 9
    9 4 8 7 4
    1 7 4 6 6
    6 8 5 6 9
    7 4 5 6 1

    輸出樣例#1: 復(fù)制

    6

    輸入樣例#2: 復(fù)制

    7 7 3 3
    7 7 7 6 2 10 5
    5 8 8 2 1 6 2
    2 9 5 5 6 1 7
    7 9 3 6 1 7 8
    1 9 1 4 7 8 8
    10 5 9 1 1 8 10
    1 3 1 5 4 8 6

    輸出樣例#2: 復(fù)制

    16

    說(shuō)明

    【輸入輸出樣例1說(shuō)明】

    該矩陣中分值最小的 222 行 333 列的子矩陣由原矩陣的第 444 行、第 555 行與第 111 列、第 333 列、第 444 列交叉位置的元素組成,為

    6 5 6

    7 5 6

    ,其分值為:

    |6?5| + |5?6| + |7?5| + |5?6| + |6?7| + |5?5| + |6?6| =6。

    【輸入輸出樣例2說(shuō)明】

    該矩陣中分值最小的3行3列的子矩陣由原矩陣的第 444 行、第 555 行、第 666 行與第 222 列、第 666 列、第 777 列交叉位置的元素組成,選取的分值最小的子矩陣為

    9 7 8
    9 8 8
    5 8 10

    【數(shù)據(jù)說(shuō)明】

    對(duì)于 \(50\%\)的數(shù)據(jù), \(1 ≤ n ≤ 12,1 ≤ m ≤ 12\),矩陣中的每個(gè)元素 \(1 ≤ a_{ij} ≤ 20\)

    對(duì)于 \(100\%\) 的數(shù)據(jù), \(1≤n≤16,1≤m≤16\) ,矩陣中的每個(gè)元素 \(1 ≤ a_{ij} ≤ 1,000,1 ≤ r ≤ n,1 ≤ c ≤ m\)


    先爆搜出\(r\)行,再在選出的行中dp選出\(c\)列即可

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std;int i,m,n,j,k,a[20][20],b[20][20],r,c,d[20],w[20],f[20][20],ans=0x3f3f3f3f;void dp() {memset(w,0,sizeof(w));memset(b,0,sizeof(b));memset(f,0x3f,sizeof(f));for(int i=1;i<=m;i++)for(int j=2;j<=r;j++) w[i]+=abs(a[d[j]][i]-a[d[j-1]][i]);for(int i=1;i<m;i++)for(int j=i+1;j<=m;j++) for(int l=1;l<=r;l++)b[i][j]+=abs(a[d[l]][i]-a[d[l]][j]);f[0][0]=0;for(int i=1;i<=m;i++)for(int j=1;j<=min(i,c);j++)for(int l=j-1;l<i;l++)f[i][j]=min(f[i][j],f[l][j-1]+b[l][i]+w[i]);for(int i=c;i<=m;i++) ans=min(ans,f[i][c]); }void dfs(int k,int now) {if(k==r) {dp(); return;}for(int i=now;i<=n-r+k+1;i++) d[k+1]=i,dfs(k+1,i+1); }int main() {scanf("%d%d%d%d",&n,&m,&r,&c);for(i=1;i<=n;i++)for(j=1;j<=m;j++) scanf("%d",&a[i][j]);dfs(0,1);printf("%d",ans); }

    轉(zhuǎn)載于:https://www.cnblogs.com/ZUTTER/p/9509605.html

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的P2258 子矩阵的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。