codevs 1257

R51234發表於2016-03-03

http://codevs.cn/problem/1257/


#include<iostream>

using namespace std;
int a[55][55],b[55];
int dp[55][55][1500];
int ans;
int main()
{
int n,m;
cin>>n>>m;
for (int i=1;i<=n;i++)
b[i]=i+b[i-1];
for (int i=1;i<=n;i++)
for (int j=1;j<=n-i+1;j++)
{
cin>>a[i][j];
a[i][j]+=a[i-1][j+1];
}
for (int i=1;i<=n;i++)
for (int j=0;j<=i;j++)
for (int l=j>0?j-1:0;l<i;l++)
for (int k=j+l;k<=min(b[i],m);k++)//一定要在剛開始就將各項的值精確,不然即使不可行的情況也會算進去。

{
dp[i][j][k]=max(dp[i-1][l][k-j]+a[j][i+1-j],dp[i][j][k]);
if (k==m)
ans=max(ans,dp[i][j][k]);
}
cout<<ans;