用dp[i][j]表示从第i行第j列到最后一排所能取到的最大值
状态转移方程是:
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + num[i][j];(num[i][j]表示i行j列位置的数字)
记忆化搜索超时了,递推形式才63ms,第一次知道了这两者的差异。原来以为只快一点,现在看来。。。。。。
代码如下:
#include #include #include #include #include #include #include #include #include #define MAX_N 500 using namespace std; int main() { //freopen("in.txt", "r", stdin); int N; int num[MAX_N][MAX_N]; scanf("%d", &N); for (int i = 1; i <= N; i++) for (int j = 1; j <= i; j++) scanf("%d", &num[i][j]); int dp[MAX_N][MAX_N]; memset(dp, 0, sizeof(dp)); for (int i = N; i >= 1; i--) for (int j = 1; j <= i; j++) { if (i == N) dp[i][j] = num[i][j]; else dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + num[i][j]; } printf("%d\n", dp[1][1]); return 0; }