数塔问题mod 100(orz)
2024-08-28 05:19:39
看一下题目 和普通的数字三角形看似没啥区别(区别很大)
然后去想:DP方程
DP[i][j]=Max(DP[i-][j],DP[i-][j-])+a[i][j] ans=Max(DP[n][..n])
这是普通的数字三角形的方程。。。然后你会发现跟这道题没啥直接关系
主要是这道题目比较毒瘤 因为 有的时候局部最优≠全局最优
所以...这题 仔细一看 mod 100 就说明了 余数 肯定<100
然而 动态规划的每一维都是表示状态。。
这里用到3个状态。 x,y,w(自然就是三维)
#include <bits/stdc++.h>
#define rep(i,j,n) for(register int i=j;i<=n;i++)
using namespace std;
typedef long long LL;
inline LL read() { LL x=; int f=; char ch=getchar();
while(!isdigit(ch)) { if (ch=='-') f=-; ch=getchar();}
while(isdigit(ch)) x=(x<<)+(x<<)+(ch^),ch=getchar(); return x*f;
}
int n;
const int N=<<;
const int mod=;
LL a[N][N];
bool DP[N][N][N];
signed main(){
n=read();
rep(i,,n) rep(j,,i) a[i][j]=read()%mod;
DP[][][a[][]]=;
rep(i,,n) rep(j,,i) rep(k,,) if(DP[i][j][k]) {
DP[i+][j][(k+a[i+][j])%mod]=;
DP[i+][j+][(k+a[i+][j+])%mod]=;
}
for(register int k=;k>=;k--) rep(i,,n) if(DP[n][i][k]) {
cout << k << endl ;
return ;
}
}
时间复杂度大概就是(100*n2)
最新文章
- 搞懂 SynchronizationContext(第一部分)【翻译】
- .edmx 文件概述(实体框架)
- boost any库
- 7月10日——[HouseStark] 扬帆起航--第一次会议
- 使用bat脚本添加JAVA_HOME和修改PATH
- ios本地推送
- [c#基础]值类型和引用类型的Equals,==的区别
- Python学习总结16:时间模块datetime &; time &; calendar (三)
- Shader for sprite clipping
- 深入剖析Classloader(二)--根类加载器,扩展类加载器与系统类加载器
- windows/linuxjdk安装,jdk1.6升级到1.7
- 浅谈Java工具类CommonUtils的使用
- MVC + AngularJS 初体验(实现表单操作)
- emmet-前端开发神器的几种写法
- 洛谷P3620 数据备份
- python高级数据可视化Dash2
- DeepLearning4J
- jq 全选与联动的小例子
- 2、let 和 const 命令
- matplotlib.pyplot 让数据可视化