首页 > 代码库 > hdu--2830--任意交换列的矩阵

hdu--2830--任意交换列的矩阵

这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                 else27                     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 }
View Code