[NOIP2014][vijos1914]子矩阵(dp)
来源:互联网 发布:php超全局变量 编辑:程序博客网 时间:2024/05/29 06:57
题目描述
传送门
题解
数据范围这么小,直接上状压dp了。。。然而写完之后发现大家都写得是暴搜+dp,而且TA竟然还用暴搜直接艹掉了!!!
其实dp的思路都是差不多的。如果用暴搜的话,就是搜出来选哪些行,然后令f(i,j)表示选到第i列已经选了j列的最小分数,diff(i,j)表示第i列和第j列差的分数。然后f(i,j)=min{f(k,j-1)+diff(k,i)},1<=k
可是我把暴搜的过程直接状压了。可以发现每一行的状态至多只有
做完之后膜拜了ta关于暴搜+剪枝复杂度的证明!!以后这种证明复杂度的问题还是要自己多想想。
代码
#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n,m,r,c,inf,ans;int a[20][20],sol[15000],f[20][20][15000],dif[20][15000],diff[20][20][15000];int Abs(int x){ return (x>0)?x:-x;}int calc(int x){ int ans=0; while (x) { ans+=(x&1); x>>=1; } return ans;}int _calc(int id,int x){ int ans=0,dig[20];dig[0]=0; for (int i=0;i<m;++i) if ((x>>i)&1) dig[++dig[0]]=m-i; for (int i=dig[0];i>1;--i) ans+=Abs(a[id][dig[i]]-a[id][dig[i-1]]); return ans;}int __calc(int id,int jd,int x){ int ans=0; for (int i=0;i<m;++i) if ((x>>i)&1) ans+=Abs(a[id][m-i]-a[jd][m-i]); return ans;}int main(){ scanf("%d%d%d%d",&n,&m,&r,&c); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) scanf("%d",&a[i][j]); for (int i=0;i<=(1<<m)-1;++i) if (calc(i)==c) sol[++sol[0]]=i; for (int i=1;i<=n;++i) for (int j=1;j<=sol[0];++j) dif[i][j]=_calc(i,sol[j]); for (int i=1;i<=n;++i) for (int j=i+1;j<=n;++j) for (int k=1;k<=sol[0];++k) diff[i][j][k]=__calc(i,j,sol[k]); memset(f,127,sizeof(f));inf=f[0][0][0]; for (int i=1;i<=n;++i) for (int j=1;j<=sol[0];++j) f[i][0][j]=0,f[i][1][j]=dif[i][j]; for (int i=2;i<=n;++i) for (int j=1;j<=min(i,r);++j) for (int k=1;k<=sol[0];++k) for (int l=1;l<i;++l) if (f[l][j-1][k]!=inf) f[i][j][k]=min(f[i][j][k],f[l][j-1][k]+diff[l][i][k]+dif[i][k]); ans=inf; for (int i=1;i<=n;++i) for (int j=1;j<=sol[0];++j) ans=min(ans,f[i][r][j]); printf("%d\n",ans);}
总结
①数据范围很小的时候不要光考虑状压,暴搜和dp结合的做法也要有意识地想一想。
0 0
- [NOIP2014][vijos1914]子矩阵(dp)
- [noip2014]子矩阵(dfs+dp)
- NOIP2014 子矩阵
- 【noip2014普及】子矩阵
- 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)
- NOIP2014普及组 T4 子矩阵 DFS+DP
- [NOIP2014]子矩阵解题报告
- 【NOIP2014】洛谷2258 子矩阵
- noip2014 子矩阵 (动态规划+位运算)
- noip2014 螺旋矩阵 (模拟)
- hdu 1559 最大子矩阵(DP)
- hdu 4328 最大子矩阵(DP)
- uvaLA 3029 最大子矩阵(DP)
- maxsum(dp求最大子矩阵)
- 最大子矩阵和(dp)
- HDU 1559 最大子矩阵 (DP)
- [BZOJ1084][SCOI2005]最大子矩阵(dp)
- BZOJ 1084 最大子矩阵 (dp)
- ASP.NET SignalR 高可用设计
- java.lang.IllegalStateException: Hardware acceleration can only be used with a single UI thread.
- RedHat 下如何安装g++编译器
- 【NOIP普及组】2016模拟考试(10.29)——摆花
- AlertDialog不显示message和title
- [NOIP2014][vijos1914]子矩阵(dp)
- 设计模式(Design Patterns)
- @GeneratedValue
- [java学习9]angularJS之指令练习
- GIT (分布式版本控制系统)
- svn + 百度云同步盘
- NDK开发 从入门到放弃(四:JNI函数、C与C++调用函数的区别)
- mysql5.7忘记密码时,修改root密码
- 序列化——反序列化(集合)