• 【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;
    }
  • 相关阅读:
    Android应用中使用自定义文字
    Linux下diff使用简介
    Android扫描SD卡中的文件
    onActivityResult不起作用?可能是和你的launchMode有关!
    修改SlidingMenu,使其能够完美运行
    eclipse快捷键说明
    XP下Virtualbox虚拟Ubuntu共享文件夹设置
    记一次调用RefreshObjectCaches刷新节点上的文件内容
    idea快捷键之遍历
    word转pdf
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444771.html
Copyright © 2020-2023  润新知