【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)<<"\n";
    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]<<"\n";
    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<<'\n';
    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]<<"\n";
    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<<"\n";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33957603/article/details/80502484