最大1矩阵

这个算是模板code,以hdu 1505为例题,完全可以将其转化为最大1矩阵问题

#include <stdio.h>
#include <iostream>
using namespace std;
const int N=1111;

int a[N][N];
int Run(const int &m, const int &n)
{
    int maxx=0;int k;
    int col[N];
    for(int j=1;j<=n;j++)     //探测每列的最长1,遇0则止
    {
        if(a[1][j]==0) col[j]=0;
        else
        {
            for(k=2;k<=m&&a[k][j]==1;++k);
            col[j]=k-1;
        }
    }
    for(int i=1;i<=m;i++)
    {
     if(i>1)
     {
         for(int j=1;j<=n;j++)
         {
             if(a[i][j]==0) col[j]=0;      //倘此处为0,则截至
             else
             {
                 if(a[i-1][j]==0)         //上一处为0,则再跑一次探测(探测最长1)
                 {
                     for(k=i+1;k<=m&&a[k][j]==1;++k);
                     col[j]=k-1;
                 }
             }
         }
     }
     for(int j=1;j<=n;j++)
     {
         if(col[j]>=i)         //y坐标向下的最长延伸
         {
             int l,r;         //凡y坐标向下延伸大于等于第j列的都可以
             for(l=j-1;l>=1&&col[l]>=col[j];--l);l++;  //向左找
             for(r=j+1;j<=n&&col[r]>=col[j];++r);r--;  //向右找
             int res=(r-l+1)*(col[j]-i+1);             //形成了一个矩阵,不要忘了加上自身
             maxx=max(res,maxx);                  
         }
     }
    }
    return maxx;
}


int main()
{
    int T;
    for(scanf("%d",&T); T; T--)
    {
        int m,n;
        char ch;
        scanf("%d%d",&m,&n);
        for(int i=1; i<=m; i++)
        {
            for(int j=1;j<=n;j++)
            {
                cin>>ch;
                if(ch=='R') a[i][j]=0;
                else        a[i][j]=1;
            }
        }
        int ans=Run(m,n);
        printf("%d\n",ans*3);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/zsyacm666666/p/5303009.html

### 银行家算法中最大需求矩阵的定义与示例 #### 最大需求矩阵的定义 最大需求矩阵(`max`)是银行家算法中的一个关键数据结构,用于记录每个进程对各类资源的最大需求量。具体来说,该矩阵的每一行对应一个进程,每一列对应一种资源类型。矩阵中的元素表示某个进程在完成其任务时可能需要的某种资源的最大数量[^3]。 #### 示例数据 以下是一个4个进程3种资源的最大需求矩阵示例: | 进程 | 资源A | 资源B | 资源C | |------|-------|-------|-------| | P0 | 7 | 5 | 3 | | P1 | 3 | 2 | 2 | | P2 | 9 | 0 | 2 | | P3 | 2 | 2 | 2 | 此矩阵表明: - 进程P0最多需要7个单位的资源A、5个单位的资源B3个单位的资源C。 - 进程P1最多需要3个单位的资源A、2个单位的资源B2个单位的资源C。 - 进程P2最多需要9个单位的资源A、0个单位的资源B2个单位的资源C。 - 进程P3最多需要2个单位的资源A、2个单位的资源B2个单位的资源C[^3]。 #### 计算需求矩阵 需求矩阵(`need`)可以通过从最大需求矩阵(`max`)中减去分配矩阵(`allocation`)来计算得出。例如,如果分配矩阵为: | 进程 | 资源A | 资源B | 资源C | |------|-------|-------|-------| | P0 | 0 | 1 | 0 | | P1 | 2 | 0 | 0 | | P2 | 3 | 0 | 2 | | P3 | 2 | 1 | 1 | 那么需求矩阵可以计算如下: | 进程 | 资源A | 资源B | 资源C | |------|-------|-------|-------| | P0 | 7 | 4 | 3 | | P1 | 1 | 2 | 2 | | P2 | 6 | 0 | 0 | | P3 | 0 | 1 | 1 | 此需求矩阵表示每个进程还需要多少资源才能完成其任务。 #### 完整代码示例 以下是一个简单的Python实现,用于计算需求矩阵: ```python # 定义最大需求矩阵分配矩阵 max_matrix = [ [7, 5, 3], [3, 2, 2], [9, 0, 2], [2, 2, 2] ] allocation_matrix = [ [0, 1, 0], [2, 0, 0], [3, 0, 2], [2, 1, 1] ] # 计算需求矩阵 def calculate_need(max_matrix, allocation_matrix): need_matrix = [] for i in range(len(max_matrix)): need = [max_matrix[i][j] - allocation_matrix[i][j] for j in range(len(max_matrix[0]))] need_matrix.append(need) return need_matrix need_matrix = calculate_need(max_matrix, allocation_matrix) # 输出需求矩阵 for i, row in enumerate(need_matrix): print(f"P{i}: {row}") ``` 运行上述代码将输出以下结果: ``` P0: [7, 4, 3] P1: [1, 2, 2] P2: [6, 0, 0] P3: [0, 1, 1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值