欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动态规划:数字三角形模型

程序员文章站 2024-02-21 19:07:10
...

参考网站:www.acwing.com
来源题目:数字三角形
动态规划:数字三角形模型
由数字三角形可以引申到题目:摘花生
动态规划:数字三角形模型
动态规划:数字三角形模型

结合划分的原则是1.不重复 2.不漏; 但是并不是要求每一个题目都要满足的,根据你要求的属性,可以发生变化。比如你要求的是一些集合的最大值,部分的重复元素并不影响最大值或者最小值;比如你要求的是元素的个数,那么这个时候就要求既不能重复也不能漏掉一些 。不漏的原则一直都必须满足。
先求出途中的最大值,再计算最后所要的

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 110;
int f[N][N];
int w[N][N];

int n;
int main(){
    cin >> n;
    while( n --){
        int r, c;
        cin >> r >> c;
        for(int i = 1; i <= r; i++){
            for(int j = 1; j <= c; j++)
            {
                cin >> 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];
            }
        }
        cout << f[r][c] << endl;
    }
    
    return 0;
}

由花生这个题目可以引申到另外一个题目:最低通行费
动态规划:数字三角形模型
题目中多了一个限制,一定步数以内完成,这里的意思其实就是不能走回头路。不走回头路刚好步数够用
代码

#include<iostream>
#include<algorithm>

using namespace std;

const int N  =110, INF = 1e9;

int n;
int w[N][N];
int f[N][N];

int main(){
    cin >> n;   
    for(int i = 1; i <= n ;i++)
        for(int j = 1; j <= n; j++)
        {
            cin >> w[i][j];
        }
        
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n ; j ++)
        {
            if(i == 1 && j == 1) f[i][j] = w[i][j];	//特判第一个位置
            else{
                f[i][j] = INF;
                if(i > 1) f[i][j] = min(f[i][j], f[i - 1][j] + w[i][j]);
                if( j > 1 ) f[i][j] = min(f[i][j], f[i][j - 1] + w[i][j]);
            }
        }
        
    cout << f[n][n];
    return 0;
}

从这道题目还衍生出来另外一道题目
方格取数
动态规划:数字三角形模型
动态规划:数字三角形模型
代码实现:

#include<iostream>
#include<algorithm>

using namespace std;
const int N = 15;
int f[N * 2][N][N];
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 + n; k++)
        for(int i1 = 1; i1 <= n; i1 ++)
            for(int i2 = 1; i2 <= n; i2 ++)
            {
                int j1 = k - i1, j2 = k - i2;
                int &x = f[k][i1][i2];
                int t = w[i1][j1];
                if(i1 !=  i2) t += w[i2][j2];
               
                if(i1 >= 1 && i1 <= n && i2 >= 1 && i2 <= n){
                    
                    x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);   //下  下
                    x = max(x, f[k - 1][i1 - 1][i2] + t);   //下 右
                    x = max(x, f[k - 1][i1][i2 - 1] + t);//右 下
                    x = max(x, f[k - 1][i1][i2] + t);//右 右
                }
            }
            
    cout << f[n + n][n][n] << endl;
    return 0;
}

动态规划:数字三角形模型

相关标签: 算法学习