记录编号 192808 评测结果 AAAAAAAAAA
题目名称 [HNOI 2004] 打砖块 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.171 s
提交时间 2015-10-12 22:09:50 内存使用 7.34 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int SIZEN=60,SIZEM=510,maxn=0x7fffffff/2;
  6. int N,M;
  7. int a[SIZEN][SIZEN]={0};
  8. int sum[SIZEN][SIZEN]={0};
  9. int f[SIZEN][SIZEM][SIZEN]={0};
  10. void read()
  11. {
  12. scanf("%d%d",&N,&M);
  13. for(int i=1;i<=N;i++)for(int j=i;j<=N;j++) scanf("%d",&a[j][i]);
  14. for(int i=1;i<=N;i++)for(int j=1;j<=N;j++) sum[i][j]=sum[i][j-1]+a[i][j];
  15. }
  16. void work()
  17. {
  18. int ans=0;
  19. for(int i=0;i<=N;i++) for(int j=0;j<=M;j++) for(int k=0;k<=N;k++) f[i][j][k]=-maxn;
  20. for(int i=0;i<=N;i++) f[i][0][0]=0;
  21. for(int i=1;i<=N;i++)
  22. for(int j=1;j<=M;j++)
  23. {
  24. for(int k=0;k<=i;k++)
  25. {
  26. for(int p=max(k-1,0);p<=min(i-1,j-k);p++)
  27. {
  28. if(f[i-1][j-k][p]!=-maxn) f[i][j][k]=max(f[i-1][j-k][p]+sum[i][k],f[i][j][k]);
  29. }
  30. if(j==M)
  31. {
  32. //cout<<i<<" "<<j<<" "<<k<<" "<<f[i][j][k]<<endl;
  33. ans=max(ans,f[i][j][k]);
  34. }
  35. }
  36. }
  37. printf("%d",ans);
  38. }
  39. int main()
  40. {
  41. freopen("brike.in","r",stdin);
  42. freopen("brike.out","w",stdout);
  43. read();
  44. work();
  45. return 0;
  46. }