提示我用动态规划,可是我不会所以就用搜索写了一手,果断超时,,20分
下面转载一个博主的满分代码学习学习
博主的思路是真的流批,大佬大佬
完整的介绍在下面这个网址
http://blog.youkuaiyun.com/u011077606/article/details/43302987
#include <stdio.h> #include <string.h> int arr[52][52]; /* * re[x1][y1][x2][y2]表示 * 传到坐标为(x1, y1)和(x2, y2)的同学的好感度最大值 */ int re[52][52][52][52]; int max(int a, int b, int c, int d) { if (a < b) a = b; if (a < c) a = c; if (a < d) a = d; return a; } int main ( ) { int m, n; int x1, y1, x2, y2; scanf("%d %d", &m, &n); for (x1 = 1; x1 <= m; x1++) { for (y1 = 1; y1 <= n; y1++) { scanf("%d", &arr[x1][y1]); } } for (x1 = 1; x1 <= m; x1++) { for (y1 = 1; y1 <= n; y1++) { for (x2 = 1; x2 <= m; x2++) { if (x1 + y1 - x2 > 0) { y2 = x1 + y1 - x2; } else continue; re[x1][y1][x2][y2] = max(re[x1-1][y1][x2-1][y2], re[x1][y1-1][x2-1][y2], re[x1][y1-1][x2][y2-1], re[x1-1][y1][x2][y2-1]) + arr[x1][y1] + arr[x2][y2]; if (x1 == x2 && y1 == y2) { re[x1][y1][x2][y2] -= arr[x1][y1]; } } } } printf("%d", re[m][n][m][n]); return 0; }