原代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e2+10;
ll n,k,i,j,K,a[N][N],f[N][N][N];
ll dfs(ll x,ll y,ll z){
if(x<1||x>n||y<1||y>n)return 0;
if(f[x][y][z]!=-1e18)return f[x][y][z];
if(z<k)f[x][y][z]=max(f[x][y][z],max(dfs(x+1,y,z+1)+a[x][y]*3,dfs(x+1,y+1,z+1)+a[x][y]*3));
return f[x][y][z]=max(f[x][y][z],max(dfs(x+1,y,z)+a[x][y],dfs(x+1,y+1,z)+a[x][y]));
}
int main(){
cin>>n>>k;
for(i=0;i<N;i++)for(j=0;j<N;j++)for(K=0;K<N;K++)f[i][j][K]=-1e18;
for(i=1;i<=n;i++)for(j=1;j<=i;j++)cin>>a[i][j];
cout<<dfs(1,1,0);
}
得分70pts. record.
修改 dp 数组下限后代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e2+10;
ll n,k,i,j,K,a[N][N],f[N][N][N];
ll dfs(ll x,ll y,ll z){
if(x<1||x>n||y<1||y>n)return 0;
if(f[x][y][z]!=-1e18)return f[x][y][z];
if(z<k)f[x][y][z]=max(f[x][y][z],max(dfs(x+1,y,z+1)+a[x][y]*3,dfs(x+1,y+1,z+1)+a[x][y]*3));
return f[x][y][z]=max(f[x][y][z],max(dfs(x+1,y,z)+a[x][y],dfs(x+1,y+1,z)+a[x][y]));
}
int main(){
cin>>n>>k;
for(i=0;i<N;i++)for(j=0;j<N;j++)for(K=0;K<N;K++)f[i][j][K]=-1e18;
for(i=1;i<=n;i++)for(j=1;j<=i;j++)cin>>a[i][j];
cout<<dfs(1,1,0);
}
得分100pts. record.
为什么下限设为 −1 和 −1018 会对答案产生影响?