题目链接

题意:

  n个物品全部乱序排列(都不在原来的位置)的方案数。

思路:

  dp[i]表示i个物品都乱序排序的方案数,所以状态转移方程。考虑i-1个物品乱序,放入第i个物品一定要和i-1个的其中一个交换位置,即;考虑i-2个物品乱序,第i-1个和第i个首先在原来的位置,两种方法使得乱序,一种和第i个交换(不能和前i-2个交换,那样成dp[i-1]),还有一种是第i个先和第i-1个交换,再和前i-2个其中一个交换,即,仔细想想,这个和dp[i-1]是不同的交换方法。

另外:

  还有二维的dp写法,虽然高精度开不了,但是还是有启发意义。设dp[i][j]表示i个物品j个乱序的方案数,状态转移方程,最后一项的(i-j+1)的意思是从前i-1个中选择在原来位置的物品进行交换,即

#include <bits/stdc++.h>const int MAXN = 2000 + 5;
struct bign {int len, num[MAXN];bign () {len = 0;memset(num, 0, sizeof(num));}bign (int number) {*this = number;}bign (const char* number) {*this = number;}void DelZero ();void Put ();void operator = (int number);void operator = (char* number);bool operator <  (const bign& b) const;bool operator >  (const bign& b) const { return b < *this; }bool operator <= (const bign& b) const { return !(b < *this); }bool operator >= (const bign& b) const { return !(*this < b); }bool operator != (const bign& b) const { return b < *this || *this < b;}bool operator == (const bign& b) const { return !(b != *this); }void operator ++ ();void operator -- ();bign operator + (const int& b);bign operator + (const bign& b);bign operator - (const int& b);bign operator - (const bign& b);bign operator * (const int& b);bign operator * (const bign& b);bign operator / (const int& b);//bign operator / (const bign& b);int operator % (const int& b);
};bign dp[805];int main() {dp[0] = 0; dp[1] = 0; dp[2] = 1;for (int i=3; i<=800; ++i) {dp[i] = (dp[i-1] + dp[i-2]) * (i - 1);}int n;while (scanf ("%d", &n) == 1 && n != -1) {dp[n].Put ();puts ("");}return 0;
}void bign::DelZero () {while (len && num[len-1] == 0)len--;if (len == 0) {num[len++] = 0;}
}void bign::Put () {for (int i = len-1; i >= 0; i--) printf("%d", num[i]);
}void bign::operator = (char* number) {len = strlen (number);for (int i = 0; i < len; i++)num[i] = number[len-i-1] - '0';DelZero ();
}void bign::operator = (int number) {len = 0;while (number) {num[len++] = number%10;number /= 10;}DelZero ();
}bool bign::operator < (const bign& b) const {if (len != b.len)return len < b.len;for (int i = len-1; i >= 0; i--)if (num[i] != b.num[i])return num[i] < b.num[i];return false;
}void bign::operator ++ () {int s = 1;for (int i = 0; i < len; i++) {s = s + num[i];num[i] = s % 10;s /= 10;if (!s) break;}while (s) {num[len++] = s%10;s /= 10;}
}void bign::operator -- () {if (num[0] == 0 && len == 1) return;int s = -1;for (int i = 0; i < len; i++) {s = s + num[i];num[i] = (s + 10) % 10;if (s >= 0) break;}DelZero ();
}bign bign::operator + (const int& b) {bign a = b;return *this + a;
}bign bign::operator + (const bign& b) {int bignSum = 0;bign ans;for (int i = 0; i < len || i < b.len; i++) {if (i < len) bignSum += num[i];if (i < b.len) bignSum += b.num[i];ans.num[ans.len++] = bignSum % 10;bignSum /= 10;}while (bignSum) {ans.num[ans.len++] = bignSum % 10;bignSum /= 10;}return ans;
}bign bign::operator - (const int& b) {bign a = b;return *this - a;
}bign bign::operator - (const bign& b) {int bignSub = 0;bign ans;for (int i = 0; i < len || i < b.len; i++) {bignSub += num[i];bignSub -= b.num[i];ans.num[ans.len++] = (bignSub + 10) % 10;if (bignSub < 0) bignSub = -1;}ans.DelZero ();return ans;
}bign bign::operator * (const int& b) {int bignSum = 0;bign ans;ans.len = len;for (int i = 0; i < len; i++) {bignSum += num[i] * b;ans.num[i] = bignSum % 10;bignSum /= 10;}while (bignSum) {ans.num[ans.len++] = bignSum % 10;bignSum /= 10;}return ans;
}bign bign::operator * (const bign& b) {bign ans;ans.len = 0; for (int i = 0; i < len; i++){  int bignSum = 0;  for (int j = 0; j < b.len; j++){  bignSum += num[i] * b.num[j] + ans.num[i+j];  ans.num[i+j] = bignSum % 10;  bignSum /= 10;}  ans.len = i + b.len;  while (bignSum){  ans.num[ans.len++] = bignSum % 10;  bignSum /= 10;}  }  return ans;
}bign bign::operator / (const int& b) {bign ans;int s = 0;for (int i = len-1; i >= 0; i--) {s = s * 10 + num[i];ans.num[i] = s/b;s %= b;}ans.len = len;ans.DelZero ();return ans;
}int bign::operator % (const int& b) {bign ans;int s = 0;for (int i = len-1; i >= 0; i--) {s = s * 10 + num[i];ans.num[i] = s/b;s %= b;}return s;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/5658559.html

递推+高精度 UVA 10497 Sweet Child Makes Trouble(可爱的孩子惹麻烦)相关推荐

  1. 递推DP UVA 1366 Martian Mining

    题目传送门 1 /* 2 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 3 到达边界后把沿途路上的权值相加求和使最大 4 DP:这是道递推题, ...

  2. POJ9273:PKU2506Tiling_递推+高精度

    总时间限制: 2000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB 描述 对于一个2行N列的走道.现在用12,22的砖去铺满.问有多少种不同的方式. 下图是一个2行17列的走 ...

  3. 递推DP UVA 590 Always on the run

    题目传送门 题意:题意难懂,就是一个小偷在m天内从城市1飞到城市n最小花费,输入的是每个城市飞到其他城市的航班. 分析:dp[i][j] 表示小偷第i天在城市j的最小花费.状态转移方程:dp[i][j ...

  4. 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度

    Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...

  5. 递推+高精度——蜜蜂路线(洛谷 P2437)

    题目选自洛谷P2437 思路和斐波那契一样,不过特判a[0][1]=0a[1[1]=1,a[2][1]=1,之后,a[i][j]=a[i-1][j]+a[i-2][j],这是主要公式,为什么开二维数组 ...

  6. 正睿OI补题(递归与递推,前缀和与差分)

    目录: P1255 数楼梯 P4552 [Poetize6] IncDec Sequence P2280 [HNOI2003]激光炸弹 P1350 车的放置 P1255 数楼梯 数楼梯 - 洛谷 递推 ...

  7. 【牛客 - 318L】彪神666(水题,半高精度,递推,trick)

    题干: 在国外,666代表魔鬼,777代表上帝. 所以牛逼的彪神就非常不喜欢6这个数字. 有一天彪神突发奇想,,他想求一些书与6无关的数. 如果一个数能被6整除,或者它的十进制表示法中某位上的数字为6 ...

  8. BZOJ-1002 轮状病毒 高精度加减+Kirchhoff矩阵数定理+递推

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3543 Solved: 1953 [Submit][Statu ...

  9. TSOJ 好好做题(屑)——递推状态压缩+高精度

    文章目录 题目描述 解题思路 喜闻乐见的AC代码 补充一:高精度 补充二:状态压缩 完整注释代码 后记 题目描述 选修程序设计和算法课程的学生人数为 n,任课老师设置了 m 道练习题目(其中:1 &l ...

最新文章

  1. 掌握好这些不变的底层知识,任他东西南北风!
  2. Charles 4.2.1 HTTPS抓包
  3. 使用CSS预处理器Less
  4. Swoole的think-swoole的安装
  5. 音视频技术开发周刊 | 216
  6. 【教程】从人脸检测与比对,实测七牛云人脸核验 API
  7. WaterfallTree(瀑布树) 详细技术分析系列
  8. HasMany() = (1..*) HasOptional() = (1..0,1) HasRequired() = (1..1)
  9. 早该知道的7个JavaScript技巧
  10. excel内容合并脚本
  11. PPT的视频由于无编码解码器无法播放问题
  12. 50多款Android运用法式遭Rootkit病毒侵扰进犯
  13. manjaro linux树莓派,manjaro
  14. Java实现压缩文件与解压缩zip文件
  15. Tim Sweeney解释为什么Unreal Engine 4全面转向C++
  16. 〖OKaimi点金胜手_2019年4月〗走地大球分析系统|万胜
  17. 用Latex写毕业论文-- 用 ctexset 重定义标题(如:第一章)
  18. [面试算法]24点计算
  19. python学生数据完善程序_「Python」每日一练:学生数据完善程序
  20. 计算机网络理论课——数据链路层

热门文章

  1. python实践项目(七)
  2. 剑指offer面试题[15]-链表中倒数第K个结点
  3. oracle物理,Oracle物理结构概述
  4. 《深入理解Java虚拟机》第7章 虚拟机类加载机制
  5. java心形代码_使用java打印心型、圆形图案的实现代码_java
  6. java 反射 asm,Java反射工具包reflectasm
  7. MATLAB plot 画多条线段的问题
  8. Optimizate objective function in matrix
  9. 【java】窗口和监听器的使用
  10. jbig java_jbig2 Java Develop 238万源代码下载- www.pudn.com