这2天 做的都是有关矩阵的 =-=....
小小矩阵 竟然有这么多 花头...
这题 的特点是 We can swap any two columns any times 就是可以任意交换X列与Y列 任意次
一开始 我还担心我的方法 会不会tle 看到3000ms就放心了。。。我总觉得 会有更高效的方法 可惜我还没想到
我的思路 就是 假如当前第X行共Y列 高度分别是 3 4 5 2 3 6
那么高度>=2的就是6-0个 这个共6列 0可以看成是(cnt[0] + cnt[1] )之和 你可以假设我们也摆放了高度为0 与 1的柱形体0个
同理 高度>=3的就是6-1个...
那么 我就是用这个方法进行计算的 蛮简单的 就是会有一些细节注意处理就好了 如 cnt[]数组在每一行都应该重置为0 因为每行的h[]数组都是在变化的
--------------其实没那么多好扯的 =-= 我先把代码隐藏了 如果现在没做出来 可以做下看 ~
1 #include <iostream> 2 using namespace std; 3 4 const int size = 1010; 5 char str[size]; 6 int h[size]; 7 int cnt[size]; 8 9 int main() 10 { 11 cin.sync_with_stdio(false); 12 int n , m , ans , sum , maxH , area; 13 while( cin >> n >> m ) 14 { 15 memset( cnt , 0 , sizeof(cnt) ); 16 memset( h , 0 , sizeof(h) ); 17 ans = 0; 18 for( int i = 1 ; i<=n ; i++ ) 19 { 20 maxH = sum = 0; 21 cin >> str; 22 for( int j = 0 ; str[j]!=‘\0‘ ; j++ ) 23 { 24 if( str[j]==‘1‘ ) 25 h[j+1] ++; 26 else 27 h[j+1] = 0; 28 cnt[ h[j+1] ] ++; 29 if( maxH < h[j+1] ) 30 maxH = h[j+1]; 31 } 32 for( int k = 0 ; k<=maxH ; k++ ) 33 { 34 if( cnt[k]!=0 ) 35 { 36 area = k * (m-sum); 37 sum += cnt[k]; 38 if( area>ans ) 39 ans = area; 40 } 41 cnt[k] = 0; 42 } 43 } 44 cout << ans << endl; 45 } 46 return 0; 47 }
hdu--2830--任意交换列的矩阵
时间: 2024-10-25 22:22:59