【NOIP2014普及組復賽】題4:子矩陣

題3:子矩陣

【題目描述】

給出如下定義:

1.子矩陣:從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣(保持行與列的相對順序)被稱為原矩陣的一個子矩陣。

例如,下面左圖中選取第 2 、 4 2、4 24行和第 2 、 4 、 5 2、4、5 245列交叉位置的元素得到一個 2 ? 3 2*3 2?3 的子矩陣如右圖所示。
在這里插入圖片描述

2.相鄰的元素:矩陣中的某個元素與其上下左右四個元素(如果存在的話)是相鄰的。

3.矩陣的分值:矩陣中每一對相鄰元素之差的絕對值之和。

本題任務:給定一個 n n n m m m列的正整數矩陣,請你從這個矩陣中選出一個 r r r c c c列的子矩陣,使得這個子矩陣的分值最小,并輸出這個分值。

【輸入】

第一行包含用空格隔開的四個整數 n , m , r , c n,m,r,c nmrc,意義如問題描述中所述,每兩個整數之間用一個空格隔開。

接下來的 n n n行,每行包含 m m m個用空格隔開的整數,用來表示問題描述中那個 n n n m m m列的矩陣。

【輸出】

輸出共 1 1 1行,包含 1 1 1個整數,表示滿足題目描述的子矩陣的最小分值。

【輸入樣例1】

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】

6

【樣例 1 說明】

該矩陣中分值最小的 2 2 2 3 3 3列的子矩陣由原矩陣的第 4 4 4行、第 5 5 5行與第 1 1 1列、第 3 3 3列、第 4 4 4列交叉位置的元素組成,為 675566 675566 675566
,其分值為 ∣ 6 ? 5 ∣ + ∣ 5 ? 6 ∣ + ∣ 7 ? 5 ∣ + ∣ 5 ? 6 ∣ + ∣ 6 ? 7 ∣ + ∣ 5 ? 5 ∣ + ∣ 6 ? 6 ∣ = 6 |6-5|+|5-6|+|7-5|+|5-6|+|6-7|+|5-5|+|6-6|=6 ∣6?5∣+∣5?6∣+∣7?5∣+∣5?6∣+∣6?7∣+∣5?5∣+∣6?6∣=6

【輸入樣例2】

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】

16

【樣例 2 說明】

該矩陣中分值最小的 3 3 3 3 3 3列的子矩陣由原矩陣的第 4 4 4行、第 5 5 5行與第 2 2 2列、第 6 6 6列、第 7 7 7列交叉位置的元素組成,選取的分值最小子矩陣為 9957888810 9957888810 9957888810

【數據說明】

對于 50 % 50\% 50% 的數據, 1 ≤ n ≤ 12 , 1 ≤ m ≤ 12 1≤n≤12,1≤m≤12 1n12,1m12, 矩陣中的每個元素 1 ≤ a [ i ] [ j ] ≤ 20 1≤a[i][j]≤20 1a[i][j]20

對于 100 % 100\% 100% 的數據, 1 ≤ n ≤ 16 , 1 ≤ m ≤ 16 1≤n≤16,1≤m≤16 1n16,1m16,矩陣中的每個元素 1 ≤ a [ i ] [ j ] ≤ 1000 , 1 ≤ r ≤ n , 1 ≤ c ≤ m 1≤a[i][j]≤1000,1≤r≤n,1≤c≤m 1a[i][j]1000,1rn,1cm

【代碼如下】:

#include <bits/stdc++.h>
using namespace std;
ifstream cin("submatrix.in");
ofstream cout("submatrix.ans");
const int N=30;
int a[N][N];
int n,m,r,c;
int f[N][N];
int w[N][N];
bitset<20>now;//偷懶用了bitset做狀壓。。。 
int calc(int x)//計算橫著的 第x行 
{int last=0x3f3f3f3f,ret=0;for(int i=0;i<m;i++)if(now[i]){if(last!=0x3f3f3f3f)ret+=abs(a[x][i+1]-last);last=a[x][i+1];}return ret;
}
int work(int x,int y)//x是這一行 y是上一行 
{if(y==0)return 0;int ret=0;for(int i=0;i<m;i++)if(now[i])ret+=abs(a[x][i+1]-a[y][i+1]);return ret;
}
void init()
{for(int i=1;i<=n;i++){int t1=calc(i);for(int j=i-1;j>=0;j--)w[i][j]=t1+work(i,j);}
}
void dp()
{int ans=0x3f3f3f3f;for(int s=0;s<(1<<m);s++){    now=s;if(now.count()!=c)continue;memset(f,0x3f,sizeof f);f[0][0]=0;init();for(int i=1;i<=n;i++){for(int j=1;j<=r;j++){for(int k=0;k<i;k++)f[i][j]=min(f[k][j-1]+w[i][k],f[i][j]);}ans=min(ans,f[i][r]);}}cout << ans << endl;
}
int main()
{cin >> n >> m >> r >> c;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin >> a[i][j];dp();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15858.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue項目中使用json編輯器

實現效果&#xff1a; 借助插件json-editor-vue3實現效果如圖一&#xff0c;如果嫌丑可以通過類名改一下樣式如圖二。 實現過程&#xff1a; 安裝插件&#xff1a;npm install json-editor-vue3 文檔鏈接&#xff1a;GitCode - 開發者的代碼家園 <script setup name&quo…

Golang發送POST請求并傳遞JSON數據

客戶端 package mainimport ("c02_get_param/common""fmt""zdpgo_resty" )func main() {// Create a Resty Clientclient : zdpgo_resty.New()// 設置字符串resp, err : client.R().SetHeader("Content-Type", "application/jso…

AcWing 3466. 清點代碼庫(STL:map,vector)

3466. 清點代碼庫 需要求有幾種不同數列&#xff0c;每種有多少個&#xff0c;可以想到用map。它的鍵是一個數列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要滿足要求的輸出序列&#xff0c;就要想把它放在其他容器&#xff0c;或數組里&…

mac清理緩存的命令

mac清理緩存的命令 在macOS中&#xff0c;你可以使用以下命令來清理緩存&#xff1a; 清理DNS緩存&#xff1a; sudo killall -HUP mDNSResponder 清理Metal緩存&#xff1a; mkdir ~/Library/Caches/com.apple.Metal 清理文件系統元數據緩存&#xff1a; sudo find /private/…

Vite + Vue3 部署 GitHub

因為靜態資源是可以部署到 GitHub 上&#xff0c;自己順便學習部署網站 因為我使用的是 Vite 工具&#xff0c;官方有提供相應 Demo 部署靜態站點 | Vite 官方中文文檔 新建文件夾 .github 然后再建一個文件夾 workflows 新建文件 main.yml 文件 直接使用官方文檔 demo #…

什么是spring 的組件掃描?

Spring的組件掃描&#xff08;Component Scanning&#xff09;是Spring框架提供的一種機制&#xff0c;用于自動尋找和注冊應用程序中的組件&#xff0c;進而減少顯式的配置。這些組件通常是標有特定注解&#xff08;如Component, Service, Repository, Controller等&#xff0…

如何處理時間序列的缺失數據

您是否應該刪除、插入或估算&#xff1f; 世界上沒有完美的數據集。每個數據科學家在數據探索過程中都會有這樣的感覺&#xff1a; df.info()看到類似這樣的內容&#xff1a; 大多數 ML 模型無法處理 NaN 或空值&#xff0c;因此如果您的特征或目標包含這些值&#xff0c;則在…

Java-MySql:JDBC

目錄 JDBC概述 JDBC搭建 1、導入mysql開發商提供的jar包 2、注冊驅動 3、與數據庫連接 注解&#xff1a; Statement&#xff1a; 代碼 運行 PreparedStatement&#xff1a; 代碼 運行 PreparedStatement和Statement Statement 增 代碼 運行 刪 代碼 運…

九、圖形化腳本

多年來&#xff0c; shell腳本一直都被認為是枯燥乏味的。但如果你準備在圖形化環境中運行腳本時&#xff0c;就未必如此了。有很多與腳本用戶交互的方式并不依賴read和echo語句。 9.1 創建文本菜單 創建交互式shell腳本最常用的方法是使用菜單。提供各種選項可以幫助腳本用戶…

AI遇上遙感,未來會怎樣?

隨著航空、航天、近地空間等多個遙感平臺的不斷發展&#xff0c;近年來遙感技術突飛猛進。由此&#xff0c;遙感數據的空間、時間、光譜分辨率不斷提高&#xff0c;數據量也大幅增長&#xff0c;使其越來越具有大數據特征。對于相關研究而言&#xff0c;遙感大數據的出現為其提…

初識GPT

初識GPT GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一種基于Transformer架構的預訓練語言模型&#xff0c;由人工智能研究公司OpenAI開發。GPT模型使用了一種稱為“自回歸”&#xff08;autoregressive&#xff09;的方法來生成文本&#xff0c;這意味…

Oracle執行DELETE語句后,回滾(還原)數據

--第一步&#xff1a;刪除數據 DELETE FROM "EMPLOYEER" WHERE id 123 --第二步&#xff1a;查看數據列表(判斷第一步中數據是否被刪除) SELECT * FROM "EMPLOYEER" AS OF timestamp to_timestamp( 2024-05-22 11:51:00, yyyy-mm-dd hh24:mi:ss ) --第…

基于MetaGPT構建LLM多智能體

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我們用了兩萬多字詳細拆解了單個Agent的組成&#xff0c;并通過Github Trending訂閱智能體理解MetaGPT框架的訂閱模塊如何解決應用問題&#xff0c;但是對于復雜&#xff0c;并行的任務&#xff0c;單…

【vue】el-select選擇器實現寬度自適應

選擇器的寬度根據內容長度進行變化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知識-可變參數、Collections工具類

目錄 可變參數 Collections工具類 Collections的常用靜態方法 實例演示 可變參數 可變參數 就是一種特殊形參&#xff0c;定義在方法、構造器的形參列表里&#xff0c;格式是&#xff1a;數據類型...參數名稱 可變參數的特點和好處 特點&#xff1a;可以不傳數據給它&am…

SQL常用基礎語句(一)-- ABCDE開頭

AS 將列名從 count(*) 修改為 total select count(*) as total from users where status0 將列名 username 改為 uname&#xff0c; password 改為 upwd select username as uname, password as upwd from users BETWEEN AND 說明&#xff1a;BETWEEN 篩選的是 >value1且 &l…

小程序主體變更是通過遷移嗎?是需要2個小程序嗎?

小程序遷移變更主體有什么作用&#xff1f;好多朋友都想做小程序遷移變更主體&#xff0c;但是又不太清楚具體有啥用&#xff0c;今天我就來詳細說說。首先&#xff0c;小程序遷移變更主體最重要的作用就是可以修改主體。比如你的小程序原來是 A 公司的&#xff0c;現在 A 公司…

并發編程筆記8--ThreadLocal結構詳解

ThreadLocal&#xff0c;即線程變量&#xff0c;是一個以ThreadLocal對象為鍵&#xff0c;任意對象為值的存儲結構。這個結構被附帶在線程上&#xff0c;也就是說一個線程可以根據一個ThreadLocal對象查詢到綁定在這個線程上的值。可以通過set(T)方法來設置一個值&#xff0c;在…

標識符的命名規則和規范

標識符概念 Java對各種變量, 方法和類等命名時使用的字符序列稱為標識符凡是自己可以起名字的地方都叫標識符 int num1 90; 標識符的命名規則(必須遵守) 由26個英文字母大小寫, 0-9, _或$組成數字不可以開頭. int 3ab 1;不可以使用關鍵字和保留字, 但能包含關鍵字和保留字…

操作系統實驗四:多線程與信號量編程

操作系統實驗上機 更多技術請訪問&#xff1a;www.xuanworld.top 部分審核不通過的文章將發至個人博客&#xff1a;www.xuanworld.top 歡迎來52破解論壇閱讀帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 實驗名稱實驗序號實驗日期實驗人多線程與信號量…