1.21学习总结

今天不知道点到什么把code block给玩死了,试图抢救,但是抢救无效,只好删了重下,终于让他变成了记忆中的模样。

在博客上看了背包问题详解,不是很理解,题目也没能做出来。

P1387:最大正方形

1.21学习总结_第1张图片

b[i][j]表示以节点i,j为右下角,可构成的最大正方形的边长。

只有a[i][j]==1时,节点i,j才能作为正方形的右下角;

对于一个已经确定的b[i][j]=x,它表明包括节点i,j在内向上x个节点,向左x个节点扫过的正方形中所有a值都为1;

b[i][j]的值为它的左,上,左上三个方向的最小值加1;

取b[i][j]的最大值为num,输出。

#include 
#include 
int a[101][101],b[101][101];
int min(int x,int y)
{
    if(x>=y)
        return y;
    else
        return x;
}
int main()
{
    int m,n;
    int num=0;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            if(a[i][j]==1)
                b[i][j]=min(min(b[i][j-1],b[i-1][j]),b[i-1][j-1])+1;
                if(b[i][j]>num)
                    num=b[i][j];
        }
    }
    printf("%d",num);
    return 0;
}

P2386:放苹果

1.21学习总结_第2张图片

调用hly函数,对于m个苹果和n个盘子:

若n>m,只有m个盘子作用,去除多余盘子,返回hly(m,m);

若n<=m,分为两种:

1.将每个盘子都放一个苹果,返回hly(m-n,m);

2.让一个盘子不放苹果,去除,返回hly(m,n-1);

若m<=1或n=1;则只有一种方法,返回1.

#include 
#include 
int n,m,num;
int hly(int m,int n)
{
    if(m<=1||n==1)
        return 1;
    if(n>m)
        return hly(m,m);
    if(n<=m)
        return hly(m-n,n)+hly(m,n-1);
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&m,&n);
        num=hly(m,n);
        printf("%d\n",num);
    }
    return 0;
}

你可能感兴趣的:(学习)