zoj 2625 Rearrange Them 动态规划
2013-10-06 15:26
232 查看
题意:给定一个序列长n,序列由1~n组成,问有多少种组合方式使得序列中的任意一个数i的前面数不是i-1?
题解:动态规划题,只要推出公式,其他一切OK。令F[i]表示长度为i的符合序列个数。则对于已知的f[0]~f[i-1],我们来推f[i]。因为f[i-1]表示长度i-1符合序列个数。则加入新的元素i,那么i处列i-1后面外,其余全部可以放,共i-1个位置。除了这种从符合条件推符合条件外,还可以从不符合条件推:前一组中有且仅有一对数(k,k+1)相连,则新加入的i插入两个数当中也能变为符合条件的序列。这样的序列有几个呢:我们考虑相连的方式,长度i-1中共i-2中种((1,2),(2,3)...(i-2,i-1))。又对于相连(k,k+1),它前面不能是k-1,后面不能是k+1,所以可以将相连数看做一个序列元素来解。则这种情况的种数为(i-2)*f[i-2]。最后得出递推式:f[i]=(i-1)*f[i-1]+(i-2)f[i-2]。
注意:上面递推看下就知道i即使比较小,f[i]也会很大,这题的题目又没给数据。。坑啊。。。,所以需要用大数处理方式
耗时:0MS/2000MS
题解:动态规划题,只要推出公式,其他一切OK。令F[i]表示长度为i的符合序列个数。则对于已知的f[0]~f[i-1],我们来推f[i]。因为f[i-1]表示长度i-1符合序列个数。则加入新的元素i,那么i处列i-1后面外,其余全部可以放,共i-1个位置。除了这种从符合条件推符合条件外,还可以从不符合条件推:前一组中有且仅有一对数(k,k+1)相连,则新加入的i插入两个数当中也能变为符合条件的序列。这样的序列有几个呢:我们考虑相连的方式,长度i-1中共i-2中种((1,2),(2,3)...(i-2,i-1))。又对于相连(k,k+1),它前面不能是k-1,后面不能是k+1,所以可以将相连数看做一个序列元素来解。则这种情况的种数为(i-2)*f[i-2]。最后得出递推式:f[i]=(i-1)*f[i-1]+(i-2)f[i-2]。
注意:上面递推看下就知道i即使比较小,f[i]也会很大,这题的题目又没给数据。。坑啊。。。,所以需要用大数处理方式
耗时:0MS/2000MS
#include <cstdio> #include <cstring> #include <cmath> #include <map> #include <iostream> #include <algorithm> using namespace std; int f[110][1100]; void add(int *a,int *b,int *c,int x,int y) { int n,m,i,j,k,t=0; n=max(a[0],b[0]); for(i=1;i<=n;i++) c[i]=x*a[i]+y*b[i]; for(i=1;i<=n;i++) { k=c[i]+t; c[i]=k%10; t=k/10; } while(t) { c[++n]=t%10; t=t/10; } c[0]=n; } void init() { memset(f,0,sizeof(f)); int i,j,k; f[0][0]=f[1][0]=f[2][0]=f[3][0]=1; f[0][1]=f[1][1]=0;f[2][1]=1;f[3][1]=3; for(i=4;i<100;i++) add(f[i-2],f[i-1],f[i],i-2,i-1); } int main() { init(); int n; while(scanf("%d",&n)!=EOF) { for(int i=f [0];i>=1;i--) cout<<f [i]; cout<<endl; } return 0; }
相关文章推荐
- ZOJ—— 2625 Rearrange Them
- ZOJ 2625 Rearrange Them(DP)
- [ZOJ 2960] Re-rejudge [动态规划+状态压缩]
- 【动态规划】POJ 1161 & ZOJ1463 & XMU 1033 Brackets sequence
- zoj 2915 hdu 2397 Dice Password Security 动态规划
- ZOJ_Arrange the Schedule
- [Google]Rearrange White Spaces
- ZOJ-3872Beauty of Array (动态规划)
- zoj 动态规划几题(简单)
- zoj 1642 Match for Bonus(动态规划)
- ZOJ 1602 Multiplication Puzzle(动态规划)
- 【动态规划】POJ 1161 & ZOJ1463 & XMU 1033 Brackets sequence
- zoj1149 Dividing 动态规划
- matlab Permute Rearrange dimensions of N-D array
- ZOJ 1462 Team Them Up! (二分图+路径保存DP)
- ZJU/ZOJ 1717 POJ 2030 The Secret Number 动态规划
- zoj 1196 Fast Food 动态规划
- zoj 3204 Connect them kruskal
- zoj 4011 Happy Sequence(动态规划)
- [ZOJ1462][POJ1112] Team Them Up!