如果要学一个技能,需要把它整个倒三角的技能都学会
所以,可以从右上角开始计算
dp[i][j][k]表示第i列,第j行,学了k个技能
转移方程就是:
dp[i][j][k]=max(dp[i][j][k],dp[i+1][p][k-j]+a[j][i])
p的值为从j-1到n-i+1

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
#define _int __int128_t
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
    return f*x;
}
void print(int x)
{
    if(x < 0) {putchar('-');x = -x;}
    if(x/10) print(x/10);
    putchar(x%10+'0');
}
int n,m,a[55][55],dp[55][55][1500],f[55];
int main ()
{
    int T,i,t,k,j,p,sum=0;
    while(cin>>n>>m){
        memset(dp,0,sizeof(dp));
        sum=0;
        for(i=1;i<=n;++i){
            f[i]=f[i-1]+i;
            for(j=1;j<=n-i+1;++j){
                cin>>a[i][j];
                a[i][j]+=a[i-1][j];
            }
        }
        for(i=n;i>=1;--i){
            for(j=0;j<=n-i+1;j++){
                for(k=f[j];k<=m;++k){
                    for(p=max(0,j-1);p<n-i+1;p++)
                    dp[i][j][k]=max(dp[i][j][k],dp[i+1][p][k-j]+a[j][i]);
                sum=max(sum,dp[i][j][k]);
                }
            }
        }
        cout<<sum<<endl;
    }

    return 0;
}