AcWing 1027. 方格取数(高难度线性dp)

╰半夏微凉° 2022-08-28 11:49 232阅读 0赞

本来想着先用dp获取最大值,然后标记,最后再dp一遍,貌似可以实现。

正解:两条路线每次走的步数是一样的,k = i1 + j1 = i2 + j2

比较来自四个方位的点的大小

引用的目的是为了让 dp 随之改变

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. int v[15][15];
  6. int dp[50][15][15];
  7. int main()
  8. {
  9. int n, a, b, c;
  10. cin >> n;
  11. while (cin >> a >> b >> c and a|b|c) v[a][b] = c;
  12. for(int k = 2; k <= n + n; k++)
  13. {
  14. for(int i1 = 1; i1 <= n; i1++)
  15. {
  16. for(int i2 = 1; i2 <= n; i2++)
  17. {
  18. int j1 = k-i1, j2 = k - i2;
  19. if(j1 <= n and j1 >= 1 and j2 <= n and j2 >= 1)
  20. {
  21. int &x = dp[k][i1][i2];
  22. int t = v[i1][j1];
  23. if(i1!=i2) t += v[i2][j2];
  24. x = max(x, dp[k-1][i1-1][i2-1] + t);
  25. x = max(x, dp[k-1][i1-1][i2] + t);
  26. x = max(x, dp[k-1][i1][i2-1] + t);
  27. x = max(x, dp[k-1][i1][i2] + t);
  28. }
  29. }
  30. }
  31. }
  32. cout << dp[n+n][n][n];
  33. return 0;
  34. }

发表评论

表情:
评论列表 (有 0 条评论,232人围观)

还没有评论,来说两句吧...

相关阅读

    相关 方格

    题目描述 设有N \\times NN×N的方格图(N \\le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00。如下图所示(见样例):