nyoj 206——矩形的个数——————【dp或公式】

矩形的个数

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
 
描述
在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形,总共18个矩形。

给出A,B,计算可以从中找到多少个矩形。
 
输入
本题有多组输入数据(<10000),你必须处理到EOF为止

输入2个整数A,B(1<=A,B<=1000)

输出
输出找到的矩形数。 
样例输入
1 2
3 2
样例输出
3
18

 dp:

#include<bits/stdc++.h>
using namespace std;
long long dp[1100][1100];
int main(){
    int A,B,i,j,k;
    for(i=1;i<1010;i++){
        for(j=1;j<1010;j++){
            dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+i*j;
        }
    }
    while(scanf("%d%d",&A,&B)!=EOF){
        printf("%lld
",dp[A][B]);
    }
    return 0;
}

  

公式:

/*先考虑只有一行的情况,假设有b列 ,可以发现矩形长为b的有1个,b-1有2个,一直到长度为1,有b个 
    则这有(b+b-1+...+2+1) 
    列则一样的情况,(a+a-1+...+2+1),那么有一行,长度为b的有b*a,两行有b*(a-1) 
    。。。 
    那么总共有(b+b-1+...+2+1)*(a+a-1+...+2+1) 
    =(b+1)*b/2 * (a+1)*a/2 
*/
#include <stdio.h>
int main() {
    float a, b;
    while ( scanf ( "%f%f", &a, &b ) + 1 )
        printf ( "%.0f
", ( a + 1 ) *a * ( b + 1 ) *b / 4 );
}
 

  

原文地址:https://www.cnblogs.com/chengsheng/p/4526225.html