zoukankan      html  css  js  c++  java
  • HDU2830

         一开始把题目意思理解错啦,做那好久没做出来。本题是一个dp问题;题目说列可以无限次对换,设矩阵为M[i][j],要找到面积大的矩形其实就是处理连续1的个数问题,用d[i][j](i表示行,j表示列)表示第i行从元素M[i][j]按列向下连1的个数,然后数组d[i]表示啦第i行向下连续1的个数的集合,对d[i]做一次sort从小到大排序,得到高度为d[i][1]到d[i][n]底边长度为1的小矩形,然后以第i行为基构成矩形的最大面积为s[i]=max{(n+1-j)*d[i][j]}(0<j<n+1),通过d[i][j]的意义可知:

    if(M[i][j]==0)  d[i][j]=0;if(M[i][j]==1) d[i][j]=d[i+1][j],计算d[i][j]的方法为从后向前,一步一步计算。算法时间复杂度为n*mlogn

    #include<iostream>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define max 1002
    int M[max][max];
    int dp[max][max];
    int DP(int m, int n);
    int main(){
    int i, j, m, n;
    string s;
    while (cin >> m >> n){
    for (i = 1; i <= m; i++){
    cin >> s;
    for (j = 0; j < n; j++)
    M[i][j + 1] = s[j] - '0';
    }
    cout<<DP(m, n) << endl;
    }
    return 0;
    }
    int DP(int m, int n){
    int i, j;
    memset(dp, 0, sizeof(dp));
    for (i = 1; i <= n; i++)
    dp[m][i] = M[m][i];
    for (i = m - 1; i >= 1; i--)
    for (j = 1; j <= n; j++){/*从下向上计算d[i][j]*/
    if (!M[i][j])
    dp[i][j] = 0;
    else
    dp[i][j] = dp[i + 1][j] + 1;
    }
    int Max = 0;
    for (i = 1; i <= m; i++){
    sort(dp[i] + 1, dp[i] + n + 1); //对每一行的d[i][j]排序
    for (j = 1; j <= n; j++) /*遍历每一行,找出最大面积存入Max*/
    if (Max < dp[i][j] * (n + 1 - j))
    Max = dp[i][j] * (n + 1 - j);
    }
    return Max;
    }

  • 相关阅读:
    [UVa514] Rails
    今日才真正懂了BFS
    [UVa11292] Dragon of Loowater
    [UVa] TEX Quotes
    白书杂七杂八
    [OpenJudge] Feed_Accounting
    [OpenJudge] Jolly_Jumpers
    Restart
    Collection of Websites
    Oracle11完全卸载方法
  • 原文地址:https://www.cnblogs.com/td15980891505/p/4964770.html
Copyright © 2011-2022 走看看