2518: 最大下降矩阵-省赛

2518: 最大下降矩阵

时间限制: 1 Sec  内存限制: 512 MB
http://acm.zzuli.edu.cn/problem.php?id=2518
题目描述
我们称一个矩阵是下降矩阵,当且仅当,矩阵的每一列都是严格下降的。很显然,这个要求很苛刻,大多数矩阵都无法满足。但是显然如果消去一些行,一定可以使得这个矩阵变成下降矩阵。

现在给出一个n行m列的矩阵,请你求出最少消去多少行,可以使得这个矩阵变为下降矩阵。
输入
输入第一行包含两个正整数n,m分别表示矩阵的行数和列数。(1<=n,m<=300)
接下来n行,每行有m个数,中间用空格隔开,每个数都小于2^31.
输出
输出仅包含一个整数,即最少消去的行数。
样例输入 Copy
1 3
1 2 3 
样例输出 Copy
0
提示
样例二
输入
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 }

 

posted @ 2020-10-30 20:22  莳曳  阅读(192)  评论(0)    收藏  举报