TRIPATHCNT (중하, p. 254)

소요 시간: 15분

책 난이도는 ‘중’인데 ‘중하’로 하향 조정

mx값 구하는 DP방식에 cnt만 추가로 세어주면 됨.

f(0,0)을 call하면 v[0][0] 정점에 대한 mx값과 mx값이 나타나는 경로수 cnt를 같이 반환하도록 점화식 구성

image.png

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> v;
int n;
struct Info{
    int mx, cnt;
    Info() {}
    Info(int mx, int cnt):mx(mx),cnt(cnt) {}
};
Info info[101][101];
Info f(int x, int y) {
    if(y<0||y>=n) return Info(0,0);
    if(x==n-1) return Info(v[x][y],1);

    Info & ret = info[x][y];
    if(ret.mx) return ret;

    Info lhs = f(x+1,y);
    Info rhs = f(x+1,y+1);
    ret.mx = max(lhs.mx, rhs.mx) + v[x][y];
    if(lhs.mx > rhs.mx) ret.cnt=lhs.cnt;
    else if(lhs.mx < rhs.mx) ret.cnt=rhs.cnt;
    else ret.cnt=lhs.cnt+rhs.cnt;
    return ret;
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int tc; cin >> tc;
    while(tc--) {
        cin >> n;
        
        v.clear(); v.resize(n, vector<int>());
        for(int i=0; i<n; i++) {
            v[i].clear(); v[i].resize(i+1);
            for(int j=0; j<=i; j++) {
                cin >> v[i][j];
            }
        }

        memset(info, 0, sizeof(info));
        Info ans = f(0,0);
        printf("%d\n", ans.cnt);
    }
    return 0;
}