zoukankan      html  css  js  c++  java
  • 【codevs1220】数字三角形

    problem

    solution

    codes

    //f[i][j]:从(i,j)出发能获得的最大值 _裸DFS
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n, a[110][110], f[110][110];
    int dfs(int i, int j){
        if(f[i][j])return f[i][j];
        if(i>n || j>n)return 0;
        return f[i][j] = max(dfs(i+1,j),dfs(i+1,j+1))+a[i][j];
    }
    int main(){
        cin>>n;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= i; j++)
                cin>>a[i][j];
        cout<<dfs(1,1)<<"
    ";
        return 0;
    }
    //f[i][j]:从(i,j)出发能获得的最大值 _裸递推
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n, a[110][110], f[110][110];
    int main(){
        cin>>n;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= i; j++)
                cin>>a[i][j];
        for(int i = n; i >= 1; i--)
            for(int j = 1; j <= i; j++)
                f[i][j] = max(f[i+1][j], f[i+1][j+1])+a[i][j];
        cout<<f[1][1]<<"
    ";
        return 0;
    }
    //f[i][j]:从(1,1)到(i,j)能获得的最大值 _裸递推
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n, a[110][110], f[110][110];
    int main(){
        cin>>n;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= i; j++)
                cin>>a[i][j];
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= i; j++)
                f[i][j] = max(f[i-1][j], f[i-1][j-1])+a[i][j];
        int ans = -0xffffff;
        for(int i = 1; i <= n; i++)ans = max(ans, f[n][i]);
        cout<<ans<<'
    ';
        return 0;
    }
    //f[i][j]:从(i,j)出发能获得的最大值 _滚动数组
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n, a[110][110], f[2][110];
    int main(){
        cin>>n;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= i; j++)
                cin>>a[i][j];
        for(int i = n; i >= 1; i--)
            for(int j = 1; j <= i; j++)
                f[i%2][j] = max(f[(i+1)%2][j], f[(i+1)%2][j+1])+a[i][j];
        cout<<f[1][1]<<"
    ";
        return 0;
    }
    //f[i][j]:从(1,1)到(i,j)能获得的最大值 _滚动数组2
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n, a, f[2][110];
    int main(){
        cin>>n;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= i; j++){
                cin>>a;
                f[i%2][j] = max(f[(i-1)%2][j], f[(i-1)%2][j-1])+a;
            }
        }
        int ans = -0xffffff;
        for(int i = 1; i <= n; i++)ans = max(ans, f[n%2][i]);
        cout<<ans<<"
    ";
        return 0;
    }
  • 相关阅读:
    [C#.NET 拾遗补漏]:迭代器和列举器
    [C#.NET 拾遗补漏]:操作符的几个骚操作
    [C#.NET 拾遗补漏]:理解 volatile 关键字
    C#-表达式目录树
    数据源管理 | 关系型分库分表,列式库分布式计算
    Java中的经典算法之冒泡排序(Bubble Sort)
    MySQL数据库优化的八种方式(经典必看)
    mysql插入数据后返回自增ID的方法(AUTO_INCREMENT)
    MySQL 插入数据后返回自增id的方法
    查询数据库中的重复数据——MySQL数据库
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444771.html
Copyright © 2011-2022 走看看