tb배열은 왜만들었는지 모르겠다. 
몽롱해서 막 코딩했는데 되게 안됐다. 
삽질하느라 디버깅한다고 che2를 매번 확인하면서 깨달은게 있다.
che2배열은 0,0쪽에 결과가 더해져서 return 한다는 것. 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <limits.h>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
typedef long long ll;
int dx[] = { 0,1 };
int dy[] = { 1,0 };
//int tb1[100001];
ll tb2[20][20];
//int che[100001];
ll che2[20][20];
//int sum[1001];
int n, m;
//int min3(int a,int b,int c){
//     a = (a < b ? a : b);
//     return (a < c ? a : c);
//}
int aaa, bbb;
ll go(int s, int e, int fx, int fy) {
       if (che2[s][e] != -1) {
              return che2[s][e];
       }
       if (s == fx && e == fy) {
              return che2[s][e] = 1;
       }
       che2[s][e] = 0;
       ll& ret = che2[s][e];
       for (int k = 0; k < 2; ++k) {
              int nx = dx[k] + s;
              int ny = dy[k] + e;
              if (aaa <= nx && nx <= fx && bbb <= ny && ny <= fy) {
                     ret += go(nx, ny, fx, fy);
              }
       }
       return ret;
}
int main(void)
{
       int n, m,k;
       cin >> n >> m >> k;
       int a, b;
       bool ans_is_easy = false;
       if (k == 0) {
              ans_is_easy = true;
       }
       for (int i = 1; i <= n; ++i) {
              for (int j = 1; j <= m; ++j) {
                     tb2[i][j] = (i - 1)*m + j;
                     if ((i-1)*m+j == k && ans_is_easy == false) {
                           a = i, b = j;
                     }
              }
       }
       
       //cout << "a b " << a << ' ' << b << endl;
       aaa = 1;
       bbb = 1;
       memset(che2, -1, sizeof(che2));
       ll kk;
       if (!ans_is_easy) {
              kk = go(1, 1, a, b);
       }
       /*for (int i = 1; i <= n; ++i) {
              for (int j = 1; j <= m; ++j) {
                     cout << che2[i][j] << ' ';
              }
              cout << endl;
       }*/
       memset(che2, -1, sizeof(che2));
       ll kkk;
       if (ans_is_easy) {
              cout << go(1, 1, n, m);
              return 0;
       }
       else {
              aaa = a;
              bbb = b;
              kkk = go(a, b, n, m);
       }
       //for (int i = 1; i <= n; ++i) {
       //     for (int j = 1; j <= m; ++j) {
       //            cout << che2[i][j] << ' ';
       //     }
       //     cout << endl;
       //}
       cout << kk * kkk;
       
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DP] 백준 2631 줄세우기  (0) 2018.04.29
[DP] 백준 5557 1학년  (0) 2018.04.29
[DP] 백준 1915 가장 큰 정사각형 만들기  (0) 2018.04.29
[DP] 백준 9461 파도반 수열  (0) 2018.04.29
[DP] 백준 2098 외판원순회  (0) 2018.04.29

참고한 블로그
그림을 보니까 이해가 됐다. 

입력받은 양의 공간만 사용해서 dp를 한게 아니라 필요에 따라 좀더 늘려서 할 수 있다는 걸 보여준 문제
ex. i,j == 1부터 입력받고 탐색은 i-1로 0부터 탐색한다. ==> 여기엔 자동으로 값이 0이 저장된 걸 이용

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <limits.h>
#include <queue>
#include <stack>
int min3(int a,int b,int c){
       a = (a < b ? a : b);
       return (a < c ? a : c);
}
using namespace std;
int tb1[100001];
int tb2[1001][1001];
int che[100001];
int che2[1001][1001];
bool doo[100001];
int n, m;
int main(void)
{
       cin >> n >> m;
       for (int i = 1; i <= n; ++i) {
              for (int j = 1; j <= m; ++j) {
                     scanf_s("%1d", &tb2[i][j]);
              }
       }
       int ans = 0;
       for (int i = 1; i <= n; ++i) {
              for (int j = 1; j <= m; ++j) {
                     if (tb2[i][j] == 1) {
                           che2[i][j] = min3(che2[i - 1][j - 1], che2[i - 1][j], che2[i][j - 1]) + 1;
                           ans = (ans < che2[i][j] ? che2[i][j] : ans);
                     }
              }
       }
       cout << ans*ans << endl;
       
       return 0;
}


'알고리즘' 카테고리의 다른 글

[DP] 백준 5557 1학년  (0) 2018.04.29
[DP] 백준 10164 격자상의경로  (0) 2018.04.29
[DP] 백준 9461 파도반 수열  (0) 2018.04.29
[DP] 백준 2098 외판원순회  (0) 2018.04.29
[DP] 백준 4811 알약  (0) 2018.04.29


#include <iostream>

using namespace std;
int d[101];
int main() {
       d[2]=d[3]=d[1] = 1;
       d[4] = d[5] = 2;
       
       for (int i = 6; i < 101; ++i) {
               d[i] = d[i - 1] + d[i - 5];
       }
       int t;
       cin >> t;
       while (t--) {
               int k;
               cin >> k;
               cout << d[k] << '\n';
       }
               
       return 0;
}



풀이

=> 1번 삼각형부터 차례대로 번호를 매기며 값을 나열해봤다. 

그 과정에서 6번째 삼각형은 5번째 삼각형의 변과 1번째 삼각형의 변으로 이루어져 있다는 것을 확인할 수 있었다.

그대로 점화식을 세우고 나열하였다. 


'알고리즘' 카테고리의 다른 글

[DP] 백준 10164 격자상의경로  (0) 2018.04.29
[DP] 백준 1915 가장 큰 정사각형 만들기  (0) 2018.04.29
[DP] 백준 2098 외판원순회  (0) 2018.04.29
[DP] 백준 4811 알약  (0) 2018.04.29
[DP] 백준 11048 이동하기  (0) 2018.04.29

+ Recent posts