bzoj1084 [SCOI2005]最大子矩阵——背包
2024-09-05 11:21:48
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1084
水题...分类讨论一下即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k,dp[][][],s1[],s2[],f[][][],w[];
int main()
{
scanf("%d%d%d",&n,&m,&k);
if(m==)
{
for(int i=;i<=n;i++)scanf("%d",&w[i]);
for(int i=;i<=n;i++)
for(int j=;j<=k;j++)
{
dp[i][j][]=max(dp[i-][j][],dp[i-][j][]);
if(j)dp[i][j][]=max(dp[i-][j][],dp[i-][j-][])+w[i];
}
printf("%d",max(dp[n][k][],dp[n][k][]));
return ;
}
else
{
for(int i=,a,b;i<=n;i++)
{
scanf("%d%d",&a,&b);
s1[i]=s1[i-]+a;
s2[i]=s2[i-]+b;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int l=;l<=k;l++)
{
f[i][j][l]=max(f[i][j-][l],f[i-][j][l]);
for(int t=;t<i;t++)//t从0开始!
f[i][j][l]=max(f[i][j][l],f[t][j][l-]+s1[i]-s1[t]);
for(int t=;t<j;t++)
f[i][j][l]=max(f[i][j][l],f[i][t][l-]+s2[j]-s2[t]);
if(i==j)
for(int t=;t<i;t++)
f[i][j][l]=max(f[i][j][l],f[t][t][l-]+s1[i]-s1[t]+s2[j]-s2[t]);
}
printf("%d",f[n][n][k]);
return ;
}
}
最新文章
- 有关sql server 2008无法导入数据库mdf文件的处理方法
- java Collection.shuffle()随机打乱一个顺序数组
- Fetch from Upstream 变灰失效
- css中的字体及文本相关属性
- 1.mybatis简介
- Program A-归并排序
- CodeForces 527B
- #Leet Code# Sqrt
- ExtJs 学习笔记
- 使用cm-12.0源代码编译twrp
- HTML DOM 改变 HTML 内容
- Azkaban实战,Command类型单一job示例,任务中执行外部shell脚本,Command类型多job工作flow,HDFS操作任务,MapReduce任务,HIVE任务
- vue-cli3.0之vue.config.js的配置项(注解)
- 关于golang.org/x包问题
- 【windows】之查看端口占用
- tabel 选中行变色和取当前选中行值等问题
- 并发编程之 ThreadLocal 源码剖析
- C# CSGL
- LintCode: Triangle
- Week4:Neural Networks难点记录