- 博客(43)
- 资源 (4)
- 收藏
- 关注
原创 lightoj 1193 DP
做差法,有问题,没A#include #include #include #include using namespace std;#define MOD 100000007long long dp[2][16000];long long N, K, S;long long sum[2][16000];int main(){ long long T, Case
2014-02-27 16:16:15 600
原创 poj 2138 DFS
首先预处理,哪些字符串是可以互相到达的还有一点要注意的是,如果一个都找不出来,就输出原单词AC代码如下:#include #include #include #include using namespace std;struct Edge{ int to, next;};char s[1100][100];int N;Edge edge[400000];
2014-02-26 16:36:06 795
原创 poj 1964 DP
优化了的 O(n^3)的算法注意输入AC代码如下:#include #include #include #include using namespace std;char maps[1100][1100];int N, M;int l[1100], r[1100];int sum[1100][1100];int main(){ int T; cin
2014-02-26 15:14:37 579
原创 poj 1920 汉诺塔 贪心
看的别人的思路:首先我们从最初的状态移到现在的状态,这样倒过来想。然后我们肯定不会去移动最大的那一个,因为要移动最大的一个步数是把其他所有的移一遍的总和加1,然后就依次判断哪些是不在它应该在的地方,然后加上相应的步数。其实是有点贪心的意思,倒过来的每一步都取最小值AC代码如下:#include #include #include #include using names
2014-02-26 14:13:02 1102
原创 poj 1850 数位DP
注意非递增的情况AC代码如下:#include #include #include #include using namespace std;int dp[11][30];char s[20];int length;int DFS( int pos, int pre, bool statu ){ if( pos >= length ){ retu
2014-02-26 10:50:56 745
原创 poj 1837 DP
dp【i】【j】表示加入第i个物品之后和力矩为j的个数由于数组下标不能为负数,所以全部加上7500(15*25*20)AC代码如下:#include #include #include #include using namespace std;int dp[21][16000];int pos[21], weight[21];int C, G;int main(){
2014-02-26 10:04:56 559
原创 poj 1737 递推
n个点时,有2^C(n,2)种图,然后要减去不连通的图的个数sub点1和另外k-1个点相连,剩下n-k个点随意 ,这种情况的个数为 f【k】 * C( n - 1, k - 1 ) * 2^C( n - k, 2 )sub = sum( f【k】 * C( n - 1, k - 1 ) * 2^C( n - k, 2 ) ) 1 AC代码如下:#include#inclu
2014-02-26 09:41:00 715
原创 poj 1952 DP
AC代码如下:#include #include #include #include using namespace std;int dp[5100], cnt[5100];int num[5100];int main(){ int N, maxlength; while( scanf( "%d", &N ) != EOF ){ for( in
2014-02-26 09:20:28 620
原创 poj 1695 DP
AC代码如下:/* dp[i][j][k] 表示最前面一个在i,其他两个在j k是的最少时间 i>=j>=k 然后向前更新即可 1A 0MS 好爽!*/#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fint dp[31][31][31];
2014-02-25 13:15:31 579
原创 hdu 1394 线段树
求出最初的的逆序数之后,有公式直接求其他的。。。。很容易推,自己推。。。。AC代码如下:#include #include #include #include using namespace std;#define MAX 5000int sum[4*MAX];void PushUp( int rt ){ sum[rt] = sum[rt*2] + sum[rt*2+
2014-02-24 20:27:12 798
原创 hdu 1166 线段树
AC代码如下:#include #include #include #include using namespace std;#define MAX 50000int sum[4*MAX];void PushUp( int rt ){ sum[rt] = sum[rt*2] + sum[rt*2+1];}void built( int l, int r, in
2014-02-24 18:47:07 692
原创 hdu 1754 线段树
AC代码如下:#include #include #include #include using namespace std;#define MAX 220000int Max[4*MAX];//注意这里int leftchild( int parent ){ return parent * 2;}int rightchild( int parent ){
2014-02-24 18:26:36 744
原创 poj 1655 树形DP
AC代码如下:#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct Edge{ int to, next;};int maxsonsize[22000], size[22000];int head[22000], tot;Edge edge[44
2014-02-23 14:33:51 687
原创 poj 1192 树形dp
好久没刷过树形dp了,都快忘记了dp【n】【0】表示不含有节点n时的最大权值和dp【n】【1】表示含有节点n时的最大权值和AC代码如下:#include #include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct Edge{ int to, n
2014-02-23 10:38:37 758
转载 把一路的故事,说给夏天的月
1.初中第一次月考,我是全班倒数第五名。老师把卷子甩到我脸上,一个耳光跟上来。“走关系的废物。”——————————————————中考前一天晚上。我跑到网吧。通宵一夜。毕竟已经被重点高中提前录取了。中考写个名字就成了。···················开端,永远不能左右结局。2.高中第一次月考。语数外三门66.其余险上。不过化学
2014-02-23 10:02:59 1870 6
原创 poj 1170 记忆化搜索
#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct BP{ int cnt; int num[6]; int price;};int hash[1000];BP bp[100];int B, S;int number[6], pr
2014-02-22 16:20:21 779
原创 poj 1141 DP
我用记忆化搜索写的,先用dp[i][j]求出括号串i到j复原后最短是多少,然后再输出。有一点就是,输入数据要用gets,用scanf!=EOF会WA。。。呵呵AC代码如下:#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fint dp[110][110];char
2014-02-21 20:31:17 628
原创 poj 1080 DP
这题我用记忆化搜索做的。。。。直接递推上去的:点击打开链接这题的方法就是dp[i][j]代表a的前i个字符与b的前j个字符所能获得的最大的匹配值然后转移就是ans = max( ans, score[num1[pos1]][num2[pos2]] + DFS( pos1 - 1, pos2 - 1 ) );//a[i]与b[j]匹配ans = max( ans, score[
2014-02-21 13:48:28 671
原创 poj 1037 DP
大致就是一位一位的遍历,比方说第一位,看1在最前有temp种情况,然后temp和C比较,如果比C大,第一位为1,否则C=C-temp,看2在第一位有多少种情况,然后和C比较,依次类推long long DFS( int statu, int a, int b ) statu == 0 表示之前是递减,然后有a个大数,b个小数的个数statu == 1 表示之前是递增,然后有a个大数,
2014-02-20 22:06:06 670
原创 poj 1019 二分
sum记录从1到1 12 123 。。。123...i 的总位数然后用二分搜k是在1到几的序列中然后再遍历一遍就行AC代码如下:#include #include #include #include #include using namespace std;long long sum[50000];int init_sum(){ long long pre = 1;
2014-02-19 12:27:55 694
原创 hdu 1813 IDA*
h()为当前所有点到边界的最小步数的 最大值要用bfs预处理下每个点到边界的最小距离,只就用直线距离会错AC代码如下:#include #include #include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct Point{ int x, y;}
2014-02-19 09:41:24 775
原创 hdu 1560 IDA*
开一个数组来记录当前枚举出的字符串已经包含了每个所给的字符串多少个字符了然后h函数为 每个所给字符串未包含的字符数的 最大值AC代码如下:#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fchar s[10][10];int N;int length[10],
2014-02-18 15:22:57 721
原创 hdu 2234 IDA*
都是泪。h_row()是求让行相等的最少步h_col()是求让列相等的最少步然后神奇的是:if( h_col() + deep //************ //*********}这样是不行的int tempp = min( h_col(), h_row() );if( tempp + deep //******* //******}而这个才是正确的。。。。次奥
2014-02-18 13:17:48 693
原创 hdu 1667 IDA*
第一道IDA*。。。。。。给链接:点击打开链接AC代码如下:#include #include #include #include using namespace std;int num[7][7];int maxdeep;char record[1000];bool check(){ int temp = num[2][2]; for( int i = 2;
2014-02-18 08:46:17 710
转载 写给静不下心来的朋友们
网上看到的,很感动,这几天虽然在努力AC,但是现在才发现还是不够努力。愿自己能够吃尽世间所有苦楚,去换取一个属于自己的未来。原文如下:写给我准备考研的朋友们这是阮晔老师上课时说过的话,很振奋人心,在这里与好友们一起分享 短暂的时间内,有什么活动能够比学习能够迅速改变自己命运来成就自己未来!你要牢牢的记住,你现在在世界上无所凭靠,我们父母都没有什么良好的背景,没有可凭靠的背景,你
2014-02-17 20:44:50 924
原创 poj 1742 多重背包O(NM)
O(NM)的多重背包不给自己写讲解,下次再遇到,不会再看一遍,从感觉没理解透AC代码如下:#include #include #include #include #include using namespace std;bool dp[100000];int cnt[100000];int num[100], value[100];int N, M;int ma
2014-02-17 19:13:04 708
原创 poj 1699 TSP
参考:点击打开链接AC代码如下:#include #include #include #include #include using namespace std;#define MAX 0x3f3f3f3fint increase[11][11];int N;int dp[11][1<<11];char s[11][30];int calc_lcs( strin
2014-02-17 14:39:50 797
原创 poj 1690 暴力
毛线的dp。。。。什么分类卧槽。。。。不过这题得到的思想就是,题目就是要我们消去括号,那么就思考消去括号有哪些情况:1、前面没有负号2、中间只有一个括号AC代码如下:#include #include #include #include using namespace std;int main(){ char s[300]; bool mark[300]; i
2014-02-17 10:26:58 681
原创 poj 1664 记忆化搜索
AC代码如下:#include #include #include #include using namespace std;int dp[11][11][11];int record[100];int DFS( int m, int n, int pre ){ if( m == 0 && n == 0 ){ // for( int i = 3; i >= 1; i--
2014-02-17 09:15:58 661
原创 hdu 2611 DFS
日!AC代码如下:#include #include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct Node{ int num, index;};int N, P, cnt, record[110];Node nodes[110];int cmp( co
2014-02-16 14:53:30 681
原创 poj 1609 DP二分没A掉!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct Node{ int x, y;};int cmp( const void *a, const void *b ){ if( ((Node*)a)->x != ((Node*)b)->x ){ retu
2014-02-15 18:54:31 504
原创 poj 1458 DP
最长公共子序列AC代码如下:#include #include #include #include using namespace std;int main(){ char a[1000], b[1000]; int dp[2][1000]; while( scanf( "%s%s", &a[1], &b[1] ) != EOF ){ memset( dp,
2014-02-15 14:35:52 555
原创 poj 1456 DP
dp[i][j]表示i到N-1物品在j到maxdeadline时间内所获得的最大收益这题要排序之后,从截至日期大的开始向小的更新。要用滚动数组,不然会超出内存AC代码如下:#include #include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct Nod
2014-02-15 14:22:58 601
原创 poj 1414 DP
网上搜的分类是DP,但是遍历就行了。。。。只不过有点麻烦。。。。。AC代码如下:#include #include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct Point{ int x, y;};struct Group{ int id; int siz
2014-02-15 13:27:37 713
原创 poj 1322 概率DP
开始的时候被数据吓到了,最后看了别人博客发现是可以缩减的。状态方程:dp[i][j] = dp[i-1][j-1] * ( C - j + 1 ) / C + dp[i-1][j+1] * ( j + 1 ) / C;因为这是收敛的,所以当i一定大的时候,由于精度的问题,可以不再计算,然后通过找规律可以发现:图片来自:点击打开链接可以发现到最后只是奇偶交换而已这一题的讨
2014-02-14 10:39:28 643
原创 poj 1208 模拟而已
毛线的dp题目理解了好半天然后WA了半天。。。。mapping那里搞错了操操操好蛋疼的模拟,不是题目蛋疼,是自己蛋疼。。。。操操操AC代码如下:#include #include #include #include #include using namespace std;int mapping[25];int s[25][100];int num[25]
2014-02-13 19:47:16 1024
原创 poj 1189 DP
dp_a/dp_b表示从(i,j)开始到M的概率AC代码如下:#include #include #include #include using namespace std;long long dp_a[55][55], dp_b[55][55];int N, M;int maps[55][55];char c;void DFS( int i, int j ){ i
2014-02-13 15:26:19 495
原创 poj 1179 记忆化搜索
注意一点:在加法的时候最大值肯定是两个最大值相加,最小值肯定是两个最小值相加在乘法的时候 最大值可能是两个最大值相乘 也可能是两个最小值相乘,最小值可能是两个最小值相乘,也可能是一个最大值和一个最小值然后我用的是记忆化搜索:dp_min[i][j]表示区间i到j的最小值, dp_max[i][j]表示区间i到j的最大值AC代码如下:#include #include #in
2014-02-13 13:31:26 738
原创 poj 1163 DP
简单dp。。。AC代码如下:#include #include #include #include using namespace std;int main(){ int num[110][110], dp[110][110]; int N; while( scanf( "%d", &N ) != EOF ){ for( int i = 0; i < N; i++
2014-02-11 11:40:46 527
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人