#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
 
int T;
int west, east;
long long dp[35][35];
 
long long solve(int e, int w)
{
    if(w == 0 || (e == w))
    {
        return 1;
    }
    
    if(dp[e][w] != 0)
    {
        return dp[e][w];
    }
    
    dp[e][w] = solve(e-1, w-1+ solve(e-1, w);
    
    return dp[e][w];;
}
 
int main(void)
{
//    freopen("B1010_input.txt", "r", stdin);
    
    cin >> T;
    
    while(T--)
    {
        memset(dp, 0sizeof(dp));
        
        cin >> west >> east;
        
        cout << solve(east, west) << "\n";
    }
    
    return 0;
}
cs
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
 
int N;
int red[1010];
int blue[1010];
int green[1010];
int dp[3][1010];
 
int solve(int color, int cnt)
{
    if(cnt == N)
    {
        return 0;
    }
    
    if(dp[color][cnt] != 99999999)
    {
        return dp[color][cnt];
    }
    
    if(color == 0)
    {
        dp[color][cnt] = min(solve(1, cnt+1+ red[cnt], solve(2, cnt+1+ red[cnt]);
    }
    else if(color == 1)
    {
        dp[color][cnt] = min(solve(0, cnt+1+ blue[cnt], solve(2, cnt+1+ blue[cnt]);
    }
    else if(color == 2)
    {
        dp[color][cnt] = min(solve(0, cnt+1+ green[cnt], solve(1, cnt+1+ green[cnt]);
    }
    
    return dp[color][cnt];
}
 
int main(void)
{
//    freopen("B1149_input.txt", "r", stdin);
    
    cin >> N;
    
    for(int i = 0; i < N; i++)
    {
        cin >> red[i] >> blue[i] >> green[i];
        
        dp[0][i] = 99999999;
        dp[1][i] = 99999999;
        dp[2][i] = 99999999;
    }
    
    cout << min({solve(00), solve(10), solve(2,0)});
    
    return 0;
}
cs
#include <iostream>
#include <algorithm>
using namespace std;
 
int N;
int arr[510][510];
int dp[510][510];
 
int solve(int row, int col)
{
    if(row == N)
    {
        return 0;
    }
    
    if(dp[row][col] != 0)
    {
        return dp[row][col];
    }
    
    dp[row][col] = max(solve(row+1, col) + arr[row][col], solve(row+1, col+1+ arr[row][col+1]);
    
    return dp[row][col];
}
 
int main(void)
{
//    freopen("B1932_input.txt", "r", stdin);
    
    cin >> N;
 
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j <= i; j++)
        {
            cin >> arr[i][j];
        }
    }
    
    cout << solve(00);
    
    return 0;
}
cs
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
 
int T, N;
int dp0[45];
int dp1[45];
 
int solve0(int n)
{
    if(n == 0)
    {
        return 1;    
    }    
    else if(n == 1)
    {
        return 0;
    }
    
    if(dp0[n] != 0)
    {
        return dp0[n];
    }
 
    dp0[n] = solve0(n-1+ solve0(n-2);
    
    return dp0[n];
}
 
int solve1(int n)
{
    cout << n << endl;
    
    if(n == 0)
    {
        return 0;    
    }    
    else if(n == 1)
    {
        return 1;
    }
    
    if(dp1[n] != 0)
    {
        return dp1[n];
    }
 
    dp1[n] = solve1(n-1+ solve1(n-2);
    
    return dp1[n];
}
 
int main(void)
{
//    freopen("B1003_input.txt", "r", stdin);
    
    cin >> T;
    
    while(T--)
    {
        cin >> N;
        
        cout << solve0(N) << " " << solve1(N) << endl;
    }
    
    return 0;
}
cs
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
 
int T, N;
int dp[1010];
int arr[1010];
 
int main(void)
{
//    freopen("B10211_input.txt", "r", stdin);
    
    cin >> T;
    
    while(T--)
    {
        cin    >> N;
        
        for(int i = 1; i <= N; i++)
        {
            cin >> arr[i];
        }
        
        int Max = -99999999;
 
        for(int i = 1; i <= N; i++)
        {
            dp[i] = max(0, dp[i-1]) + arr[i];
            Max = max(Max, dp[i]);
        }
        
        cout << Max << endl;
    }
    
    return 0;
}
cs
#include <iostream>
#include <string>
#include <algorithm>
#include <string.h>
using namespace std;
 
int cost[1010][1010];
int dp[1010][1010][4]; // 0 : 왼쪽, 1 : 중앙, 2 : 오른쪽 
int row, col;
 
int solve(int x, int y, int dir)
{
    if(x == row)
    {
        return 0;
    }
    
    if(dp[x][y][dir] != 99999999)
    {
        return dp[x][y][dir];
    }
    
    // 왼쪽
    if(dir != 0 && y-1 >= 0)
    {
        dp[x][y][dir] = solve(x+1, y-10+ cost[x][y];     
    } 
    
    // 중앙 
    if(dir != 1)
    {
        dp[x][y][dir] = min(dp[x][y][dir], solve(x+1, y, 1+ cost[x][y]);    
    }
    
    // 오른쪽
    if(dir != 2 && y+1 < col)
    {
        dp[x][y][dir] = min(dp[x][y][dir], solve(x+1, y+12+ cost[x][y]); 
    } 
    
    return dp[x][y][dir];
}
 
int main(void)
{
//    freopen("B17485_input.txt", "r", stdin);
    
    cin >> row >> col;
    
    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < col; j++)
        {
            cin >> cost[i][j];
            
            for(int k = 0; k < 4; k++)
            {
                dp[i][j][k] = 99999999;    
            }
        }
    }
     
    int Min = 99999999;
    for(int i = 0; i < col; i++)
    {
        // 처음에는 방향이 없기 때문에 dir에 3을 대입 
        Min = min(Min, solve(0, i, 3));
    }
    
    cout << Min;
    
    return 0;
}
cs
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
 
int N, K;
int dp[101][100001];
int w[101];
int v[101];
 
int solve(int item, int capacity)
{
    if(item >= N)
    {
        return 0;
    }
    
    if(dp[item][capacity] != 0)
    {
        return dp[item][capacity];
    }
    
    // 배낭에 넣지 않는 경우 
    dp[item][capacity] = solve(item+1, capacity);     
    
    // 배낭에 넣는 경우 
    if(capacity-w[item] >= 0)
    {
        dp[item][capacity] = max(dp[item][capacity], solve(item+1, capacity-w[item]) + v[item]);    
    } 
    
    return dp[item][capacity]; 
}
 
int main(void)
{
//    freopen("B12865_input.txt", "r", stdin);
    
    cin >> N >> K;
    
    for(int i = 0; i < N; i++)
    {
        cin >> w[i] >> v[i];    
    }
    
    cout << solve(0, K);
    
    return 0;
}
cs
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
 
int N, M, C;
int jewel[15]; 
int dp[12][1<<13][22]; // [현재가방][챙긴보석][남은한도] 
 
int solve(int cur, int visited, int capacity)
{
    if(cur == M)
    {
        return 0;
    }
    
    if(dp[cur][visited][capacity] != 0)
    {
        return dp[cur][visited][capacity];
    } 
    
    for(int i = 0; i < N; i++)
    {
        if(visited & (1 << i))
        {
            continue;
        }    
        
        if(capacity < jewel[i])
        {
            dp[cur][visited][capacity] = max(dp[cur][visited][capacity], solve(cur+1, visited, C));    
        }
        else 
        {
            dp[cur][visited][capacity] = max(dp[cur][visited][capacity], solve(cur, visited | (1 << i), capacity - jewel[i]) + 1);
        }
    } 
    
    return dp[cur][visited][capacity];
}
 
int main(void)
{
//    freopen("B1480_input.txt", "r", stdin);
    
    cin >> N >> M >> C;
    
    for(int i = 0; i < N; i++)
    {
        cin >> jewel[i];
    }
    
    cout << solve(00, C);
    
    return 0;
}
cs

+ Recent posts