Monge矩陣

Monge矩陣

對一個m*n的實數矩陣A,如果對所有i,j,k和l,1≤ i<k ≤ m和1≤ j<l ≤ n,有 ? ? ? ? ?A[i,j]+A[k,l] ≤ A[i,l]+A[k,j] ? 那么,此矩陣A為Monge矩陣。

換句話說,每當我們從矩陣中挑出兩行與兩列,并且考慮行列交叉處的4個元素,左上角與右下角的和小于或等于左下角與右上角元素的和。

例如,下面這個就是一個Monge矩陣

(1)證明一個矩陣為Monge陣,當且僅當對所有i=1,2,...,m-1和j=1,2,...,n-1,有 ? ? ? ? ? ?A[i,j]+A[i+1,j+1] ≤ A[i,j+1]+A[i+1,j]

(提示:在當部分,對行、列分別使用歸納法。)

(2)下面的矩陣不是Monge陣。改變一個元素,把它變成Monge矩陣

???????????? 37?????? 23?????? 22????? 32

???????????? 21??????? 6?????? 27????? 10

???????????? 53?????? 34?????? 30????? 31

???????????? 32?????? 13??????? 9?????? 6

???????????? 43?????? 21?????? 15?????? 8

很明顯是要改27,27可以改成【2,5】內的任何一個實數

(3)假設f(i)是第i行包含最左端最小值的列的索引值。證明對任何的m x n Monge矩陣,有f(1) ≤ f(2) ≤...≤ f(m)。

(4)下面是一個用來計算m x n 的Monge矩陣A中每一行的最左最小值的分治算法的描述:

?? 構造一個包含所有A的偶數行的子矩陣A'。遞歸地計算A'中每一行的最左端最小值。然后計算A中奇數行的最左端最小值。

?? 解釋如何能在O(m+n)時間內計算出A的奇數行的最左端最小值?(在偶數行最左最小值已知的情況下)

解釋:看下面的代碼就很明顯了。

其實這個算法,我個人感覺,就結構而言比較像分治,但是就思想而言比較像動態規劃。

(5)寫出(4)所描述算法的運行時間的遞歸式,并證明其解為O(m+nlogm)

T(m)=T(m/2)+ O(m+n)(求解略)

我的代碼:
?

#include<iostream>
using namespace std;void calculate(double **A, int r1, int r2, int min, int max, int *f)	//計算f(r1)到f(r2)
{if (r1 > r2)return;int r = (r1 + r2) / 2;int result = min;int flag = A[r][min];for (int i = min + 1; i <= max; i++)	//尋找最左最小元素flag,和它的的下標result{if (A[r][i] < flag){flag = A[r][i];result = i;}}f[r] = result;calculate(A, r1, r - 1, min, result, f);calculate(A, r + 1, r2, result, max, f);
}bool isMonge(double **A, int m, int n)	//判斷是否是Monge矩陣
{for (int i = 0; i < m - 1; i++)for (int j = 0; j < n - 1; j++)if (A[i][j] + A[i + 1][j + 1]>A[i + 1][j] + A[i][j + 1])return false;return true;
}
int main()
{int m, n;while (cin >> m >> n && m>1 && n > 1){double **A = new double*[m];		//Monge矩陣int *f = new int[m];	//不需要在主函數里面進行初始化,這個工作由calculate函數完成for (int i = 0; i < m; i++){A[i] = new double[n];for (int j = 0; j < n; j++)cin >> A[i][j];}if (isMonge(A, m, n)){cout << "這個是Monge矩陣" << endl;calculate(A, 0, m - 1, 0, n - 1, f);for (int i = 0; i < m; i++)cout << "第" << i << "行的最左最小元素的列下標是" << f[i] << endl;}else cout << "這個不是Monge矩陣";}return 0;
}

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

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

相關文章

全面梳理Python下的NLP 庫

一、說明 Python 對自然語言處理庫有豐富的支持。從文本處理、標記化文本并確定其引理開始&#xff0c;到句法分析、解析文本并分配句法角色&#xff0c;再到語義處理&#xff0c;例如識別命名實體、情感分析和文檔分類&#xff0c;一切都由至少一個庫提供。那么&#xff0c;你…

地理數據的雙重呈現:GIS與數據可視化

前一篇文章帶大家了解了GIS與三維GIS的關系&#xff0c;本文就GIS話題帶大家一起探討一下GIS和數據可視化之間的關系。 GIS&#xff08;地理信息系統&#xff09;和數據可視化在地理信息科學領域扮演著重要的角色&#xff0c;它們之間密切相關且相互增強。GIS是一種用于采集、…

歐拉函數和最大公約數

分析&#xff1a;如果兩個數的最大公約數是一個質數p&#xff0c;那么這兩個數都除以p&#xff0c;得到的兩個數的最大公約數一定是1. 反證法&#xff1a;如果得到的兩個數的最大公約數不是1&#xff0c;那么把此時的最大公約數乘以上邊的最大公約數&#xff0c;得到的一定比上…

文件操作 和 IO

目錄 ?編輯一、認識文件 1、文件路徑 2、其它知識 二、Java 中操作文件 三、文件內容的讀寫 1、Reader 2、InputStream 3、輸出 一、認識文件 文件是在硬盤上存儲數據的一種方式&#xff0c;操作系統幫我們把硬盤的一些細節都封裝起來了 我們只需要了解文件相關的一些…

【前端 | CSS】滾動到底部加載,滾動監聽、懶加載

背景 在日常開發過程中&#xff0c;我們會遇到圖片懶加載的功能&#xff0c;基本原理是&#xff0c;滾動條滾動到底部后再次獲取數據進行渲染。 那怎么判斷滾動條是否滾動到底部呢&#xff1f;滾動條滾動到底部觸發時間的時機和方法又該怎樣定義&#xff1f; 針對以上問題我…

數據集成革新:去中心化微服務集群的無限潛能

在當今數據密集型的業務環境下&#xff0c;傳統的集中式架構已經難以滿足高可用性和高并發性的要求。而去中心化微服務集群則通過分散式的架構&#xff0c;將系統劃分為多個小型的、獨立部署的微服務單元&#xff0c;每個微服務負責特定的業務功能&#xff0c;實現了系統的高度…

centos系統kubeadm安裝K8S_v1.27.x容器使用docker(K8S_v1.24版本以后依然使用docker容器管理)

kubeadm安裝K8S_v1.27.x容器使用docker 按照需要的文檔點擊這里下載 一.環境部署 1.1基礎環境配置 主機IP 主機名規劃 192.168.186.128 k8s-master01 192.168.186.129 k8s-node01 192.168.186.130 k8s-node02 1.2修改機器名稱 #永久修改主機名 hostnamectl set-hostname …

docker搭建opengrok環境

引言&#xff1a; 由于這幾天開始 http://aospxref.com/ 網站沒法用了。用習慣了opengrok的方式看AOSP的源碼&#xff0c;其他的在線查看源碼的網站用起來都不是很理想。所以考慮搭建一個環境。 首先網上看了下opengrok的環境搭建的方式&#xff0c;最終還是采用docker的方…

【JS 一個數組隨機選取x個元素】

可以使用Math.random()方法&#xff0c;結合循環和splice()方法來實現&#xff1a; let arr [1,2,3,4,5,6,7,8,9]; let randomArr [];for(let i 0; i < 4; i) {let randomIndex Math.floor(Math.random() * arr.length);let randomNum arr.splice(randomIndex, 1)[0];…

基于C#的無邊框窗體陰影繪制方案 - 開源研究系列文章

今天介紹無邊框窗體陰影繪制的內容。 上次有介紹使用雙窗體的方法來顯示陰影&#xff0c;這次介紹使用API函數來進行繪制。這里使用的是Windows API函數&#xff0c;操作系統的窗體也是用的這個來進行的繪制。 1、 項目目錄&#xff1b; 下面是項目目錄&#xff1b; 2、 函數介…

日常BUG——SpringBoot模糊映射

&#x1f61c;作 者&#xff1a;是江迪呀??本文關鍵詞&#xff1a;日常BUG、BUG、問題分析??每日 一言 &#xff1a;存在錯誤說明你在進步&#xff01; 一、問題描述 SpringBoot在啟動時報出如下錯誤&#xff1a; Caused by: java.lang.IllegalStateExceptio…

ARM處理器

1、RISC處理器&#xff1a; RISC (Reduced Instruction Set Computer) 微處理器是一種計算機微處理器架構&#xff0c;其設計原則是通過簡化指令集來提高執行速度。 (1)、RISC處理器的設計理念&#xff1a; 簡化指令集&#xff1a;RISC 微處理器的指令集非常精簡&#xff0c…

【Python COM】Word 自動縱向合并相同內容單元格

使用場景 docxtempl 庫不支持動態縱向合并單元格&#xff0c;所以寫了這段代碼用來曲線救國。 使用方法 需要縱向合并的單元格加上在文本末尾加上“【縱向合并】”&#xff0c;然后調用此函數&#xff0c;就會自動縱向合并相同內容的單元格。 代碼 需要安裝 pywin32 庫。 …

VC2015,C++內存中運行EXE文件

VC2015,C內存中運行EXE文件&#xff0c;點擊可以下載 VC2015項目中所用的源碼主要源自于網絡&#xff0c;修正一些錯誤后&#xff0c;源碼如下&#xff0c;此源碼在VC6中可以正常編譯&#xff0c; 但在VC2015中&#xff0c;就會出現一些錯誤&#xff0c;本項目源碼已經把錯誤修…

文件批量重命名001到100

文件批量重命名001到100如何搞定&#xff1f;這是一個許多朋友都在熱議的話題&#xff0c;今天我將向大家介紹這方面的內容&#xff0c;希望你會喜歡。總的來說&#xff0c;文件重命名快捷鍵CtrlF2在日常工作中非常實用。它可以輕松快速地完成文件和文件夾的重命名操作&#xf…

儲能pcb的布局注意事項與制造難點

隨著新能源需求的不斷增長和能源結構的轉型&#xff0c;儲能技術的市場規模不斷擴大。儲能PCB作為儲能系統中電池模塊的重要組成部分&#xff0c;對整個系統的安全性和性能起到關鍵作用。今天我們就來聊聊&#xff0c;儲能pcb有什么特征。 什么是儲能&#xff1a;儲能是指能量…

用友Java后端筆試2023-8-5

計算被直線劃分區域 在笛卡爾坐標系&#xff0c;存在區域[A,B],被不同線劃分成多塊小的區域&#xff0c;簡單起見&#xff0c;假設這些不同線都直線并且不存在三條直線相交于一點的情況。 img 那么&#xff0c;如何快速計算某個時刻&#xff0c;在 X 坐標軸上[ A&#xff0c;…

kubernetes 中的事件(event)簡介以及如何收集event和基于event告警

引用另外一篇文章對k8s event的介紹 1.什么是kubernetes事件 Kubernetes Events 是一種 Kubernetes 資源對象&#xff0c;記錄了某個組件在某個時間做了某個動作&#xff0c;用于展示集群內發生的情況&#xff0c;當 Kubernetes 集群中資源狀態發生變化時&#xff0c;可以產生…

PostMan 教程

安裝https://www.cnblogs.com/mafly/p/postman.html Postman 使用方法詳解https://blog.csdn.net/fxbin123/article/details/80428216 postman進行http接口測試https://blog.csdn.net/five3/article/details/53021084 postman的使用方法詳解&#xff01;最全面的教程https:/…

Golang項目中如何輕松實現私有倉庫pkg包的引入

在企業內部創建一個公共的Golang模塊工程可以幫助提高代碼復用性和開發效率。本文將從如何創建一個公共的Golang工程開始&#xff0c;指導你一步步創建它、并引入到你的工程中。 1、公共模塊規范 下面是一個簡單的步驟指南來創建這樣一個公共模塊項目。 創建版本控制倉庫&am…