下面这个是错的
#include <bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar(); }
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
ll dp[102][102];
ll a[102][102];
int main()
{
int n=read();
int k=read();
k=min(k,n);
for(int j=0;j<=n;j++){
for(int m=0;m<=k;m++){
dp[j][m]=-INT_MAX;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
a[i][j]=read();
if(i==1){
dp[1][0]=a[1][1];
dp[1][1]=max(dp[1][0],a[1][1]*3);
for(int u=2;u<=k;u++){
dp[1][u]=dp[1][1];
}
}
}
for(int i=1;i<=n;i++){
for(int j=i;j>0;j--){
for(int m=k;m>0;m--){
dp[j][m]=max(max(dp[j-1][m],dp[j][m])+a[i][j],max(dp[j-1][m-1],dp[j][m-1])+a[i][j]*3);
}
dp[j][0]=max(dp[j-1][0],dp[j][0])+a[i][j];
}
}
ll ans=-INT_MAX;
for(int i=1;i<=n;i++){
for(int m=0;m<=k;m++){
ans=max(ans,dp[i][m]);
}
}
cout<<ans;
}
但是这个就是对的
#include <bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar(); }
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
ll dp[102][102];
ll a[102];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n=read();
int k=read();
k=min(k,n);
for(int j=0;j<=n;j++){
for(int m=0;m<=k;m++){
dp[j][m]=-INT_MAX;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
a[j]=read();
if(i==1){
dp[1][0]=a[1];
dp[1][1]=max(a[1],a[1]*3);
for(int m=2;m<=k;m++){
dp[1][m]=dp[1][1];
}
continue;
}
for(int j=i;j>0;j--){
for(int m=k;m>0;m--){
dp[j][m]=max(max(dp[j-1][m],dp[j][m])+a[j],max(dp[j-1][m-1],dp[j][m-1])+a[j]*3);
}
dp[j][0]=max(dp[j-1][0],dp[j][0])+a[j];
}
}
ll ans=-INT_MAX;
for(int i=1;i<=n;i++){
for(int m=0;m<=k;m++){
ans=max(ans,dp[i][m]);
}
}
cout<<ans;
}