矩形的个数
时间限制: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 ); }