2518: 最大下降矩阵-省赛
2518: 最大下降矩阵
时间限制: 1 Sec 内存限制: 512 MB题目描述
我们称一个矩阵是下降矩阵,当且仅当,矩阵的每一列都是严格下降的。很显然,这个要求很苛刻,大多数矩阵都无法满足。但是显然如果消去一些行,一定可以使得这个矩阵变成下降矩阵。
现在给出一个n行m列的矩阵,请你求出最少消去多少行,可以使得这个矩阵变为下降矩阵。
现在给出一个n行m列的矩阵,请你求出最少消去多少行,可以使得这个矩阵变为下降矩阵。
输入
输入第一行包含两个正整数n,m分别表示矩阵的行数和列数。(1<=n,m<=300)
接下来n行,每行有m个数,中间用空格隔开,每个数都小于2^31.
接下来n行,每行有m个数,中间用空格隔开,每个数都小于2^31.
输出
输出仅包含一个整数,即最少消去的行数。
样例输入 Copy
1 3
1 2 3
样例输出 Copy
0
提示
样例二
输入
3 1
3
1
2
输出
1
输入
3 1
3
1
2
输出
1
其实这题就是个裸的最大下降子序列
但是蒟蒻的我不出意料的没有想出来
可以把每一行看作是一个数,原理和lcm没有区别
判断在第i行时能取得最长的严格下降的行数的大小
具体看代码:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 typedef long long ll; 5 ll a[305][305]; 6 ll n,m,sum; 7 ll goback[305],maxlen[305]; 8 bool ican(ll i,ll j){ 9 for(int u=1;u<=m;u++) if(a[j][u]<=a[i][u]) return false; 10 return true; 11 } 12 int main(){ 13 scanf("%ld%ld",&n,&m); 14 for(int i=1;i<=n;i++) 15 for(int j=1;j<=m;j++) 16 scanf("%ld",&a[i][j]); 17 maxlen[1]=1;sum=1; 18 for(int i=1;i<=n;i++){ 19 ll k=0; 20 for(int j=1;j<n;j++){ 21 if(ican(i,j)){ 22 k=max(k,maxlen[j]); 23 if(k==maxlen[j]) goback[i]=j; 24 } 25 maxlen[i]=k+1; 26 sum=max(sum,maxlen[i]); 27 } 28 } 29 //for(int i=1;i<=n;i++) printf("%ld ",maxlen[i]); 30 printf("%ld",n-sum); 31 return 0; 32 }