zoukankan      html  css  js  c++  java
  • AcWing 275. 传纸条

    题目传送门

    本题其实就是方格取数的那道题,唯二不同的是:

    (1) 数据范围变成了\(50\)

    (2) 行是\(m\),列是\(n\), 不再是一个正方形,变成了一个矩形,其实都一样。

    #include <bits/stdc++.h>
    
    using namespace std;
    const int N = 55;
    
    int n, m;
    int w[N][N];
    int f[N * 2][N][N];
    
    int main() {
        cin >> m >> n;
        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= n; j++)
                cin >> w[i][j];
    
        //左上角是(1,1),k表示两个小朋友所在位置的x+y的和,最多是2*n
        for (int k = 2; k <= n + m; k++)
            for (int x1 = 1; x1 <= m; x1++)//第一个小朋友竖着走的距离
                for (int x2 = 1; x2 <= m; x2++) {//第二个小朋友竖着走的距离
                    int y1 = k - x1, y2 = k - x2;//计算横着走的距离
                    //不能出界,只走有效的位置
                    if (y1 >= 1 && y1 <= n && y2 >= 1 && y2 <= n) {
                        //PK获取到最优的上一个状态
                        int t = f[k - 1][x1 - 1][x2];
                        t = max(t, f[k - 1][x1 - 1][x2 - 1]);
                        t = max(t, f[k - 1][x1][x2 - 1]);
                        t = max(t, f[k - 1][x1][x2]);
                        //将本位置的数值加上
                        f[k][x1][x2] = t + w[x1][y1];
                        //如果不是重复的位置,还可以继续加上
                        if (x1 != x2 && y1 != y2) f[k][x1][x2] += w[x2][y2];
                    }
                }
        //输出DP的结果
        printf("%d\n", f[m + n][m][m]);
        return 0;
    }
    
    
    
  • 相关阅读:
    C++虚函数表解析(转)
    学习网址
    css 段落文字换行问题
    移动端fixed兼容问题
    半数集1
    汇编寄存器
    设计模式概述
    Vector用法介绍
    汇编PC硬件基本特征
    android 反编译总结
  • 原文地址:https://www.cnblogs.com/littlehb/p/15637700.html
Copyright © 2011-2022 走看看