题解 最大加权矩阵
虽然是一道橙题,但还是蕴含了重要算法思想——降维思想。
如果是一维形式,即最大子段和,我们采取先求前缀和,并固定右端点,减去左边最小的办法求。
对于这题,若固定了上下边界,则可以利用列的前缀和将其“压缩”为一维形式,再采取“最大子段和”的方式求解。
如下面一个二维矩阵:
1 2 3 4 -1 3 4 10 9 10 8 6
可以压缩成如下一维形式:
9 15 15 20
便可以在 内求解。
算上固定上下边界,总时间复杂度就是
CODE:
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL read() { LL sum=0,flag=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') flag=-1; c=getchar(); } while(c>='0'&&c<='9') { sum=sum*10+c-'0'; c=getchar(); } return sum*flag; } const int N=150; int n,ans=-1e9; int a[N][N],sum[N][N],f[N]; int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; } } for(int j=1;j<=n;j++) { for(int i=1;i<=n;i++) { sum[i][j]=sum[i-1][j]+a[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { for(int z=1;z<=n;z++) { int val=sum[i][z]-sum[j-1][z]; f[z]=max(val,f[z-1]+val); ans=max(ans,f[z]); } // ans=max(ans,f[n]); } } cout<<ans<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效