数字三角形模型 AcWing 1027. 方格取数

àì夳堔傛蜴生んèń 2023-09-28 13:52 191阅读 0赞

数字三角形模型 AcWing 1027. 方格取数

原题链接

AcWing 1027. 方格取数

算法标签

DP 线性DP

思路

错误思路:分两次走

由于第一次走时可能存在多条路径都是第一次的解集,分开走只能选择其中的一条。但第一次走过的地方会被重置成0,无法确定是第一次同样是最优解而未被你选择的情况下第二次的值会不会比你已经得出的答案要大
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define rep(i, a, b) for(int i=a;i<b;++i)
  4. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  5. using namespace std;
  6. const int N = 105;
  7. int f[2*N][N][N], a[N][N];
  8. int aa, b, c, d;
  9. inline int read(){
  10. int s=0,w=1;
  11. char ch=getchar();
  12. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  13. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  14. return s*w;
  15. }
  16. void put(int x) {
  17. if(x<0) putchar('-'),x=-x;
  18. if(x>=10) put(x/10);
  19. putchar(x%10^48);
  20. }
  21. signed main(){
  22. ios::sync_with_stdio(false);
  23. cin.tie(0);
  24. cout.tie(0);
  25. int n=read();
  26. while(aa=read(), b=read(), c=read(), aa||b||c){
  27. a[aa][b]=c;
  28. }
  29. // 行列值之和 由行确定列
  30. rep(k, 2, n+n+1){
  31. // 第一次第i行
  32. rep(i1, 1, n+1){
  33. // 第二次第i行
  34. rep(i2, 1, n+1){
  35. // j1表示第一次第j列 j2表示第二次第j列
  36. int j1=k-i1, j2=k-i2;
  37. if(j1>=1&&j1<=n&&j2>=1&&j2<=n){
  38. int t=a[i1][j1];
  39. // 非同一条路径
  40. if(i1-i2){
  41. t+=a[i2][j2];
  42. }
  43. // 下下 下右 右下 右右
  44. f[k][i1][i2]=max({f[k][i1][i2], f[k-1][i1-1][i2-1]+t, f[k-1][i1-1][i2]+t, f[k-1][i1][i2-1]+t, f[k-1][i1][i2]+t});
  45. }
  46. }
  47. }
  48. }
  49. printf("%lld", f[2*n][n][n]);
  50. return 0;
  51. }

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

发表评论

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

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

相关阅读

    相关 [NOIP2000]方格

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

    相关 方格

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