250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#1939#중량제한
- 백준#boj#16932#모양만들기
- 백준#BOJ#14501#퇴사#브루트포스
- 백준#BOJ#12865#평범한배낭
- 백준#BOJ#2615#오목
- 백준#boj#12755
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 2421 ] 저금통 본문
https://www.acmicpc.net/problem/2421
문제 : (1,1)에서 (N,N)이 될때까지 수를 이어붙여서 나올 수 있는 소수의 횟수를 구해라
해설 : 전형적인 dp 문제입니다. 그냥 대놓고 2차원 점화식을 선언해서 dp로 푸세요 라고 알려주고 있죠
$dp[x][y]= (1,1)\ 에서\ (x,y)\ 까지\ 만들때\ 나올\ 수\ 있는\ 소수의\ 최대\ 개수$
재귀함수를 이용해서 탑-다운 방식으로 풀어주었습니다.
소수는 에라토스체네스의 체로 걸러주었습니다.
#include <bits/stdc++.h>
using namespace std;
int n;
int dp[1000][1000],sosu[1000010];
int f(int x,int y);
int get_sosu(int x,int y);
int main() {
cin>>n;
memset(dp,-1,sizeof(dp));
for(int i=2;i*i<=1000000;i++){
for(int j=i+i;j<=1000000;j+=i)
sosu[j]=1;
}
dp[1][1]=0;
cout<<f(n,n);
return 0;
}
int f(int x,int y)
{
if(x<1 || y<1)return 0;
int &ret = dp[x][y];
if(ret!=-1)return ret;
ret=0;
ret = max(ret,max(f(x-1,y),f(x,y-1)));
ret+=get_sosu(x,y);
return ret;
}
int get_sosu(int x,int y)
{
int ty=y;
int cnt=0;
while(ty>0){
ty/=10;
x*=10;
}
x+=y;
if(sosu[x])return 0;
return 1;
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[ boj : 5052 ] 전화번호 목록 (0) | 2021.07.03 |
---|---|
[ boj : 1451 ] 직사각형으로 나누기 (0) | 2021.06.26 |
[ boj : 16986 ] 인싸들의 가위바위보 (0) | 2021.06.13 |
[ boj : 2073 ] 수도배관공사 (0) | 2021.06.07 |
[ boj : 9527 ] 1의 개수 세기 (0) | 2021.06.03 |