TIOJ 1268. 得分高手 (Master)

TIOJ-1268

DP題

紀錄每個位置的能得到最大分數
可以選擇向右、向下、不走,所以
\[ f(x, y) = max(f(x+1, y), f(x, y+1), 0) \]
一開始一直 WA ,後來發現 ans 忘記初始設 0

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
#include<bits/stdc++.h>
int c[3005][3005], m[3005][3005];
int M, N;
int dp(int x, int y){
if(x>=M||y>=N) return 0;
if(c[x][y]) return c[x][y];
return c[x][y] = std::max(std::max(dp(x+1, y)+m[x+1][y], dp(x, y+1)+m[x][y+1]), 0);
}
int main(){
int ans=0, tmp;
scanf("%d%d", &M, &N);
memset(m, 0, sizeof(m));
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
scanf("%d", &m[i][j]);
}
}
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
tmp = m[i][j]+dp(i, j);
if(tmp>ans) ans = tmp;
}
}
printf("%d", ans);
}