zoj2901【DP·二进制优化】
来源:互联网 发布:iea数据每周几公布 编辑:程序博客网 时间:2024/06/18 04:28
题意:
要排一个L长度的序列,当 j 放在 i 后面的时候会增加v[ i ][ j ]的值,求构成L长度序列的最大值。
思路:
可以想到预处理任意两点<i,j>的最大值是多少,然后题目还有个限制,就是长度,那么再加一维k,
DP[k][i][j] 代表长度为k,i 到 j的最大价值。
但是我们看到L很大,这样不行,那么就把长度表示成二进制,dp[0][i][j]为长度为1时,i到j的最大价值,dp[k][i][j]代表长度为(2^k+1),i到j的最大价值。
最后求长度L的最大值。
贴一发大神的code。。
#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL INF=1e18;const int N=1e2+10;LL f[20][N][N],g[2][N];int n,L;int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&L); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%lld",&f[0][i][j]); --L; int lev=0; for(int i=0;(1<<(i+1))<=L;i++) { for(int j=0;j<n;j++) for(int k=0;k<n;k++) { f[i+1][j][k]=-INF; for(int x=0;x<n;++x) f[i+1][j][k]=max(f[i][j][x]+f[i][x][k],f[i+1][j][k]); } ++lev; } int cur=0; fill(g[cur],g[cur]+n,0); for(int i=lev;i>=0;--i) { if(L<(1<<i)) continue; L-=(1<<i); cur=1-cur; fill(g[cur],g[cur]+n,-INF); for(int j=0;j<n;j++) for(int k=0;k<n;k++) g[cur][k]=max(g[1-cur][j]+f[i][j][k],g[cur][k]); } printf("%lld\n",*max_element(g[cur],g[cur]+n)); } return 0;}
0 0
- zoj2901【DP·二进制优化】
- HDU1059 【DP·二进制数优化】
- hdu 1059 Dividing(dp+二进制优化)
- POJ 3071 Football 概率DP 二进制优化
- hdu 2844 Coins(dp 多重背包 二进制优化)
- POJ 1014 Dividing 【DP 之 多重背包 / 二进制优化】
- [HDU 2844 Coins]DP+二进制优化+多重背包
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
- bzoj1190 [HNOI2007]梦幻岛宝珠 ( 二进制分组优化背包DP)
- 二进制优化
- HDOJ 2191 (多重背包/二进制分解/单调队列优化DP)
- 洛谷 P1782 旅行商的背包(二进制优化下的DP)
- 二进制(dp)
- Dividing二进制背包优化
- hdu_2191_二进制优化
- 多重背包二进制优化
- 多重背包二进制优化
- 时间片轮转调度算法
- 多线程关于wait()和sleep()的区别
- 474. Ones and Zeroes
- Oracle数据库入门
- 数组实现矩阵逐层加1
- zoj2901【DP·二进制优化】
- 将iOS默认上下文坐标系改变为Quartz通常坐标系
- 第十四章 Spring集成测试
- swift 3.0 哈希sha1方法
- 类型转换小细节
- AOP在Android中的使用(作为依赖库)
- CCCC练习 5-10树的遍历
- 基于蒙特卡罗的VOI(Value of Information)
- mysql 用户