nyoj 206-사각형의 개수------[dp 또는 공식]

1376 단어 dp

직사각형의 개수


시간 제한:
1000ms | 메모리 제한: 65535KB
난이도:
1
 
묘사
3*2의 직사각형 중 1*1의 직사각형 6개, 2*1의 직사각형 4개, 1*2의 직사각형 3개, 2*2의 직사각형 2개, 3*1의 직사각형 2개와 3*2의 직사각형 1개로 총 18개의 직사각형을 찾을 수 있다.
A, B를 주고 그 중에서 몇 개의 직사각형을 찾을 수 있는지 계산해 보세요.
 
입력
이 문제는 여러 개의 입력 데이터 (<10000) 가 있습니다. EOF까지 처리해야 합니다.
정수 A 2개, 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 ); }

좋은 웹페이지 즐겨찾기