最大子矩阵之和
最大子矩阵和
分析
一道dp题
观察数据
先考虑
不选时直接从上一个继承
选时从小于
有了
同理
除此之外
当
此时有(即
然后就没有然后了
点击查看代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 10010
#define int long long
using namespace std;
int sum[maxn],dp[maxn][10],a[maxn],pre[maxn],vis[maxn];
//bool cmp(node a,node b){return a.val>b.val;}
int solve(int x,int K)
{
for(int i=1;i<=x;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(int k=1;k<=K;k++)
{
for(int i=1;i<=x;i++)
{
dp[i][k]=dp[i-1][k];
for(int j=0;j<=i;j++)
{
dp[i][k]=max(dp[i][k],dp[j][k-1]+sum[i]-sum[j]);
}
}
}
return dp[x][K];
}
int b[maxn],suma[maxn],sumb[maxn],f[110][110][11];
int solve2(int x,int K)
{
for(int i=1;i<=x;i++)
{
scanf("%lld%lld",&a[i],&b[i]);
suma[i]=suma[i-1]+a[i];
sumb[i]=sumb[i-1]+b[i];
}
for(int k=1;k<=K;k++)
{
for(int i=1;i<=x;i++)
{
for(int j=1;j<=x;j++)
{
f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);
for(int l=0;l<i;l++) f[i][j][k]=max(f[i][j][k],f[l][j][k-1]+suma[i]-suma[l]);
for(int l=0;l<j;l++) f[i][j][k]=max(f[i][j][k],f[i][l][k-1]+sumb[j]-sumb[l]);
if(i==j) for(int l=0;l<i;l++) f[i][j][k]=max(f[i][j][k],f[l][l][k-1]+suma[i]+sumb[i]-sumb[l]-suma[l]);
}
}
}
return f[x][x][K];
}
int n,m,k;
signed main()
{
scanf("%lld%lld%lld",&n,&m,&k);
if(m==1)
{
printf("%lld\n",solve(n,k));
return 0;
}
else
{
printf("%lld",solve2(n,k));
return 0;
}
return 0;
}
/*
6 1 1
3
3
1
1
-2
1
3 2 2
1 -3
2 3
-2 3
*/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战