记录编号 192974 评测结果 AAAAAAAAAA
题目名称 [HNOI 2004] 打砖块 最终得分 100
用户昵称 Gravatarwoca 是否通过 通过
代码语言 C++ 运行时间 0.348 s
提交时间 2015-10-13 16:55:18 内存使用 23.28 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <fstream>

using namespace std;

int z[100][100],y[100][100];
int x[100];
int n,m;
int d[100][100][600];//d[i][j][k]表示旋转后第i行第j位打了k块 
int main()
{
    freopen("brike.in","r",stdin);
    freopen("brike.out","w",stdout);
    memset(d,-0x3f,sizeof(d));
    memset(z,0,sizeof(z));
    memset(y,0,sizeof(y));
    scanf("%d%d",&n,&m);x[0]=0;
    for(int i=1;i<=n;i++)
    x[i]=x[i-1]+i;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n-i+1;j++)
            scanf("%d",&z[i+j-1][i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
            y[i][j]=y[i][j-1]+z[i][j];
    d[0][0][0]=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=i;j++){
            for(int k=j;k<=m;k++){
                for(int p=(j-1<0)?0:j-1;p<=i-1;p++){
                    d[i][j][k]=max(d[i][j][k],d[i-1][p][k-j]+y[i][j]);
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    for(int j=0;j<=i;j++)
    if(d[i][j][m]>ans)
    ans=d[i][j][m];
    printf("%d\n",ans);
    return 0;
}