題目:
時間限制:
2000ms
單點時限:
1000ms
記憶體限制:
256mb
給你乙個m x n (1 <= m, n <= 100)的矩陣a (0<=aij
<=10000),要求在矩陣中選擇一些數,要求每一行,每一列都至少選到了乙個數,使得選出的數的和盡量的小。
多組測試資料。首先是資料組數t
對於每組測試資料,第1行是兩個正整數m, n,分別表示矩陣的行數和列數。
接下來的m行,每行n個整數,之間用乙個空格分隔,表示矩陣a的元素。
每組資料輸出一行,表示選出的數的和的最小值。
小資料:1 <= m, n <= 5
大資料:1 <= m, n <= 100
樣例輸入
23 31 2 3
3 1 2
2 3 1
5 51 2 3 4 5
5 1 2 3 4
4 5 1 2 3
3 4 5 1 2
2 3 4 5 1
解題思路:
假設矩陣起始是行和列相等的,即起初m=n.
f(m,n)= min m=n時 0<=i<=n
min m因為是從m=n的矩陣開始,先m-1,再n-1,所以不存在 m>n的情況。
然而題目中m和n有可能不相等,不妨假設 m>n
將m>n的矩陣部分,每一行都取該行最小值。
#include#include#includeusing namespace std;
//fun函式用來解決 矩陣中行與列相等的那部分。
int fun(int **p,int m,int n,vectorm_i,vectorn_j)
int min=65535;
for(int i=0;i<=n;i++)
int min=65535;
for(int i=0;i<=m;i++)
{ vector::iterator result=find(m_i.begin(),m_i.end(),i);
if(result!=m_i.end()) continue;
m_i.push_back(i);
int temp=p[i][n]+fun(p,m,n-1,m_i,n_j);
m_i.pop_back();
if(temp>m>>n;//m為行 n為列
int **p=new int*[m];
for(int i=0;i>p[i][j];
//m比n大,則把m>n的行,每一行取最小值
int part_sum=0;
if(m>n)
{ for(int i=n;i(),vector())+part_sum<(),vector())+part_sum<(),vector())《型別的m_i 和n_j 中。
程式設計之美資格賽
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定2個樹a和b,保證a的節點個數 b的節點個數。現在你需要對樹a的邊進行二染色。乙個好的染色方案,指不存在乙個樹a中的連通塊,同時滿足以下2個條件 1.其中只有同色的邊 2.和b同構。兩個樹同構是指,存在乙個一一對映 既是單射...
程式設計之美2015資格賽
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 1.年份能被4整除但不能被100整除 2.年份能被400整除 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,year ...
2013程式設計之美資格賽總結
終於可以完成乙個程式比賽的題目了,雖然這次的時間有些長。這是第一次完成,感到真心不錯。廢話不說了,下面說一下這次程式設計之美預選賽的情況。當我在凌晨看到這三個題目時,感覺第乙個還有希望,第二個一點思路沒有,第三個不敢期望。第乙個是詞對變換,感覺不太難。第二道是一種.怎麼說呢,反正是一點思路沒有。第三...