摘要: DP+高精度+滚动数组还是1009的题目,不过数据再大点,数组都开不下,需要滚动数组。回想1009的递推的方式,可以看到,要知道当前位的信息,只需要知道前一位的信息即可,所以其实任何时候都只需要两位,所以我们可能用户滚动数组,不断替换,而算法思想是完全不变的//用递推来实现,要得到当前位的信息只与前一位有关,因为用滚动数组,只保存两位,不断滚动//dp[0][]表示前一位的信息,dp[1][]表示当前位的信息,每一位的数字只能为0和非0#include <cstdio>#include <cstring>#define MAX 1900 //位数#define LEN 阅读全文
posted @ 2013-01-21 20:54 Titanium 阅读(386) 评论(0) 推荐(0) 编辑
摘要: DP+高精度 (和1009是一样的题目,不过数字的位数达到了180,所以要用高精度)同样是记忆化搜索实现,不过加入了高精度,一些细节地方就注意一下。我的代码写的不好,有点长有点乱…………#include <cstdio>#include <cstring>#define LEN 210 //高精度数组的大小#define MAX 210 //位数struct num{ int a[LEN],len; //a数组保存高精度}dp[MAX][15]; //最多180位,最高进制为10int N,K;void init(){ for(int i=1; i<N; i++) 阅读全文
posted @ 2013-01-21 17:40 Titanium 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 数论题题意:有无限的水供应,另外有AB两个杯子,他们有容量,分别为ca和cb,满足0<ca<=cb,并且ca和cb互质一开始两个杯子都没有水。一种操作是,你能往一个杯子加水,但必须把这个杯子加满,一种操作是倒水,但一定要把水倒空,一种操作是把一个杯子的水倒给另一个杯子,但要求是至少使一个杯子为空或者另一个杯子。现在给你一个数字n,n<=cb,现在的任务是使B杯的水量为n,至于A杯的水量是多少都行,问你要怎么做。这题对于一个case其实有多种答案,不过题目对于输出并没有要求并没有需要优化,任意一组可行解即可这题一开始没有头绪,从推理的角度来看这题,但是一直找不到出路。题目归类在 阅读全文
posted @ 2013-01-21 13:08 Titanium 阅读(358) 评论(0) 推荐(0) 编辑
摘要: DP,最大子矩阵和:先按列压缩为一维i,在用最大连续子序列和来求。在枚举列压缩求和的时候,为了提高速度,可以在输入的时候先保存下来,就不用每次都去计算,不过再代码中没有写另外这题不允许空矩阵,即至少要有一个元素,所以代码要做稍微的修改,就这样WA了几次/*最大子矩阵和,先压缩为一维再求最大子序列和,时间复杂度O(n^3)*/#include <cstdio>#include <cstring>#define N 1100#define INF 0x3f3f3f3fint a[N][N],s[N],n;void get_sum(int x ,int y){ for(int 阅读全文
posted @ 2013-01-21 12:02 Titanium 阅读(329) 评论(0) 推荐(0) 编辑