#include<cstdio>
int main(void)
{
int n, m, t;
int val[30][30]={0};
scanf("%d", &t);
for(int test=0; test<t; test++)
{
scanf("%d%d", &n, &m);
for(int j=0; j<m; j++)
{
val[0][j] = j+1;
}
for(int i=1; i<n; i++)
{
for(int j=i; j<m; j++)
{
val[i][j] = val[i][j-1] + val[i-1][j-1];
}
}
printf("%d\n", val[n-1][m-1]);
}
return 0;
}
이런저런 생각을 하다가 엉뚱한데 시간을 보냈지만, 그림을 그려보면 왼쪽에 i개 오른쪽에 j개가 있을 때의 경우의 수는, 왼쪽 i, 오른쪽에 j-1개 있을 때와 왼쪽에 i-1개 오른쪽에 j-1개 있을 때의 합과 같다.
오른쪽이 하나 적었을 경우와, 오른쪽이 추가 되었을 때, 왼쪽의 가장 큰 것이 오른쪽을 포함하는 경우를 더하면 된다.
알고리즘 분류 : 다이나믹 프로그래밍
Artikel Menarik Lainnya
위상정렬 | Topological sort
위상정렬이라는 것은, 문제를 풀때 참 많이 쓰이는 기본적인 알고리즘이다.
위상 정렬은 DAG 그래프를 기본으로 사용되는데, DAG(Directed Acyclic Graph
2차원 배열의 부분합 구하기배열은 프로그래밍에서 가장 많이 쓰이는 자료구조 중 하나입니다. 그만큼 배열을 잘 다루는 것이 프로그래밍을 잘 하는 것이자, 개발이나 여러 문제 해결에 도움이 되는 측면이 크죠.
경로찾기 | 백준 11403번
#include <iostream>
using namespace std;
int main() {
int n;
int graph[100][100];
ci
1,2,3 더하기 | 백준 9095번
#include <cstdio>
int main(void)
{
int t;
scanf("%d", &t);
for(
숨바꼭질 | 백준 1697번
#include <iostream>
using namespace std;
int main() {
int n, k;
int pos[100001];
cin
연속합 | 백준 1912번
이번 문제는 시간 초과 때문에 생각을 많이 했다.
어쩌면 더 쉽게 풀 수 있는 걸, 전에 풀어봤던 다른 생각에 갇혀 있던 것 아니었나 싶다.
맨 처음 생각한 알고리즘은 다음과
EmoticonEmoticon