数字三角形模型
题谱

因为全是版子题,所以这里并没有详细写题解。
还是说,先要状态表示,再写出状态转移方程,同时,部分题记得初始化。
#include <iostream>
using namespace std;
const int N = 110;
int T;
int w[N][N];
int f[N][N];
int main()
{
    scanf("%d", &T);
    while (T--)
    {
        int r, c;
        scanf("%d %d", &r, &c);
        for (int i = 1; i <= r; i++)
            for (int j = 1; j <= c; j++)
                scanf(" %d", &w[i][j]);
        for (int i = 1; i <= r; i++)
            for (int j = 1; j <= c; j++)
                f[i][j] = max(f[i - 1][j], f[i][j - 1]) + w[i][j];
        printf("%d\n", f[r][c]);
    }
    return 0;
}#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 110;
int n;
int w[N][N];
int f[N][N];
int main()
{
    scanf("%d", &n);
    memset(f, 0x3f, sizeof(f));
    // 第一个点让他强制等于w[1][1];
    f[0][1] = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            scanf(" %d", &w[i][j]);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            f[i][j] = min(f[i - 1][j], f[i][j - 1]) + w[i][j];
    printf("%d\n", f[n][n]);
    return 0;
}#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 12;
// f[k][i1][i2]表示第一个点走到(i1,k-i1)第二个走到(i1,k-i2)所取得的最大数字和
int f[N * 2][N][N];
// w[i][j]是原图
int w[N][N];
int n;
int main()
{
    cin >> n;
    int a, b, c;
    while (cin >> a >> b >> c, a || b || c)
        w[a][b] = c;
    for (int k = 2; k <= n * 2; k++) // 控制走的步数一致
    {
        for (int i1 = 1; i1 < min(k, n + 1); i1++) // 即不用多搜,也保证能搜满全图
        {
            for (int i2 = 1; i2 < min(k, n + 1); i2++)
            {
                int j1 = k - i1, j2 = k - i2;
                // 如果走到一个点上,加一个就行
                int t = w[i1][j1];
                // 走的点不一样,两个都要加
                if (i1 != i2)
                    t += w[i2][j2];
                int &x = f[k][i1][i2];
                x = max(x, f[k - 1][i1 - 1][i2 - 1]);
                x = max(x, f[k - 1][i1][i2 - 1]);
                x = max(x, f[k - 1][i1 - 1][i2]);
                x = max(x, f[k - 1][i1][i2]);
                x += t;
            }
        }
    }
    printf("%d", f[n * 2][n][n]);
    return 0;
}AcWing 275. 证明传纸条为何可以使用方格取数的代码 - AcWing
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 60;
// 表示学生矩阵有m行n列
int m, n;
// 同学的好心程度
int w[N][N];
int f[N + N][N][N];
int main()
{
    scanf("%d %d", &m, &n);
    for (int i = 1; i <= m; i++)
        for (int j = 1; j <= n; j++)
            scanf(" %d", &w[i][j]);
    for (int k = 2; k <= m + n; k++)
    {
        for (int i1 = 1; i1 <= m; i1++)
        {
            for (int i2 = 1; i2 <= m; i2++)
            {
                int j1 = k - i1, j2 = k - i2;
                if (j1 < 1 || j1 > n || j2 < 1 || j2 > n)
                    continue;
                int t = w[i1][j1];
                if (i1 != i2)
                    t += w[i2][j2];
                int &x = f[k][i1][i2];
                x = max(x, f[k - 1][i1 - 1][i2 - 1]);
                x = max(x, f[k - 1][i1][i2 - 1]);
                x = max(x, f[k - 1][i1 - 1][i2]);
                x = max(x, f[k - 1][i1][i2]);
                x += t;
            }
        }
    }
    printf("%d", f[m + n][m][m]);
    return 0;
}
                
            本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 梓dayo
        
     评论
            
                匿名评论
                隐私政策
            
            
                你无需删除空行,直接评论以获取最佳展示效果