수를 1X2 or 2X1 크기의 블럭으로 묶고 , 묶인 수들의 차의 합의 최대 / 최소를 찾는문제다 비트dp를 이용해서 풀 수 있다!테이블은 d[위치][상태] 이다 -> 여기서 상태는 (위치~위치+3)까지의 상태0부터 마지막 칸까지 가며 상태를 보고 내가 할 수 있는 행동들을 하면 된다내 위치에서의 상태는 2가지다 1) 내가 있는 칸이 안채워진 경우여기서 x,y를 보고 또 판단 해야 한다n번째 줄이 아니라면 세로 가능~!2번째 칸이 아니고 옆칸이 비었으면 가로 가능~! a) 가로로 놓을 수 있는 경우 (내 옆칸도 비었을 때)b) 세로로 놓을 수 있는 경우 (위에서부터 보며 내려오므로 무조건 가능) 2) 채워진 경우이 때는 바로 다음 블럭으로 넘어간다 (pos+1,(state>>1)) 이렇게 최대 , 최소..
처음봤을 때 DP로 풀다가 실패해서 안푼 문제다그러다가 오늘 다시 다익스트라로 풀었다 다익스트라로 생각하면 쉽게 풀 수 있다내가 K번 말처럼 뛸 수 있으므로 cnt =K로 하고 cnt를 저장해서 가져다니면 된다 pq에 넣고 다니면 끝이다..!아 근데 이문제 가로 세로 잘봐야한다 ㅋㅋㅋ 그리고 다들 오타가 안나도록 조심.. n,m,= 이런거... 소스코드123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include #include #include #include using namespace std;int..
옛날에 틀린 DP 문제다지금보니 점화식은 맞았는데 정렬은 안해서 틀렸다 아이템을 다 먹는 경우의 수 이므로 현재아이템-> 다음아이템 의 경우의 수를모두 곱하면 답이된다! 그래서 벡터에 아이템 좌표를 다 넣고 정렬을 한 후 dp를 하면된다~~! 소스코드1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include #include #include #include using namespace std;int d[111][111], arr[111][111];int n, m, a, b; int go(int x1, int y1, int x2, int y2) { if (x1>x2 || y1>y2) return 0;..
문자열 S에서 T가 나오는동안 다 지우고 남은 문자열을 출력하는 문제다계속 틀렸따 푸는 방법을 알았는데도 코딩을 못해서 계속틀렸다 푸는 방법은 KMP로 S에서 T를 찾다가 찾으면 바로 제거하고 남은부분을 다시 KMP하는 방법이다! 이걸 다른곳에서 만나면 또 틀릴것같다 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243#include #include #include #include using namespace std;char ans[1000011];int top;vector preprocessing(string & s) { int n = s.size(); int j = 0; vector pi(n, 0); for ..
정말 오랜만에 쓰는 요리글...! 방학기념 다이어트를 위해 닭가슴살을 샀는데 냉동에 자리가 없어서자리를 만들기 위해 냉동재료를 다 꺼내서 요리를 했어요 ㅎㅎ 닭다리살이 있어서 급식시절을 추억하며.. 급식닭갈비를 만들었습니다 먼저 냉동에서 닭갈비에 넣을만한거 다 꺼냅니다!재료 : 고추장 / 고춧가루 / 간장 / 올리고당 / 고추기름 / 아이스 단호박 / 아이스 대파 / 아이스 마늘 / 아이스 청양고추 그리고 마지막으로 닭다리살~~! 먼저 물을넣고 닭을 끓입니다..! 그동안 양념을 만듭시다..! 양념은 고추장 4 + 간장 3 + 고춧가루 1.5 + 고추씨 1 + 고추기름 1 +올리고당 3넣었어요~~! 섞섞 그리고 바로 끓고있는 닭다리살들에게 떨굽니다 단호박과 함께 연기... 연기...2 다 끓어가면 청양고추..
Bessie와 Elsie가 1에서 출발해 N에서 만나려고한다간선은 M개가 주어진다(간선은 낮은숫자 ->높으숫자만 가능)근데 둘이 간선을 지나갈 때의 시간이 다르다이 때 M에서 만날 수 있는 최소의 시간을 구하는 문제다N이 16밖에 안되기 때문에 bfs로 모든 경로를 다 구했다그리고 N까지 가는 시간 중 가장 작은수를 출력하면 답이다! 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243#include #include #include #include #include using namespace std;int n, m;void bfs(vector& Graph, set&S) { queue q; q.push({ 0,0 ..
문제가 좀 길다요약하자면 X진법으로 나타낸 수 A와 Y진법으로 나타낸 수 B를 줄 때A=B를 만드는 X와 Y를 찾는 문제다 예를들어 A = 419 // B = 782를 줬을 때8892 를 47진법으로 나타내면 419 , 35진법으로 나타내면 782 이므로답은 X=47, Y=35 이다 문제는 길지만 수가 작아서 쉽다완탐으로 진짜 다 해보면 된다~! 소스코드123456789101112131415161718192021222324252627282930313233343536#include #include #include using namespace std;#define ll long long vector vt; ll go(ll a, ll b) { ll ret = 0; ll c = 1; while (a != 0) ..
왼쪽 끝에서 오른쪽 끝으로 가려고한다이 때 가지고있는 값이 달라야하며, 왼쪽 오른쪽 각각 1칸이상 떨어져있어야한다DP로 풀면된다! x,y를 대각선부터보면서 갈수있으면 더해가고 오른쪽 끝이라면 return1한다~ 소스코드123456789101112131415161718192021222324252627282930313233#include #include using namespace std;#define ll long longint arr[111][111],n,m,k;int d[111][111];int dx[3] = { 1,1,0 };int dy[3] = { 0,1,1 };int mod = 1e9 + 7;int go(int x, int y) { if (x == n - 1 && y == m - 1) return..
문자열 S에서 T가 없을때까지 계속 지우고 S를 출력하는 문제다처음에 그냥 string STL도 써보고 kmp도 써봤는데 시간초과났다 ㅎㅎ100만이더라 ㅎㅎ 그래서 스택으로 풀었다 진짜 스택을 써서 풀었는데 그럼 넘 느렸다앞으로는 스택의 개념만 쓰도록 하자그럼 짱빠르다 굿소스코드(스택 진짜 씀;;;;)1234567891011121314151617181920212223242526272829303132#include #include #include #include using namespace std;int main() { stack st; string s, t; cin >> s >> t; int n = s.size(); int m = t.size(); reverse(t.begin(), t.end()); fo..
suffix array를 이용하는 문제다suffix array에 관한건 구글링을....!원리는 1,2,4,8...,len 까지 이전에 구한것을 이용해 O(1)만에 계속 구해가는 것이다 suffix array에 대한 설명이 없는점 죄송 ㅎㅎ 어렵네요 이거..저도 아직 완벽하게 정리가 안된지라 ㅎㅎ좀 더 공부해서 나중에 이론게시판에 쓰는걸로..! 소스코드12345678910111213141516171819202122232425#include #include #include #include using namespace std;int main() { string s; cin >> s; int n = s.size(), l = 1; vector sa(n), g(n + 1), ng(n + 1); g[n] = ng[n..