随笔分类 -  DP

摘要:一.问题描述 与分治法不同的是动归的子问题间不是相互独立的,前一个往往为后一个提供信息。 看下面一个例子,计算三个矩阵连乘{A1,A2,A3};维数分别为10*100 , 100*5 , 5*50 按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次 按此顺序计算需要的次数(A1*(A2*A3)):10X5X50+10X100X50=75000次 所以问题是:如何确定运算顺序,可以使计算量达到最小化。二.问题分析 枚举显然不可,如果枚举的话,相当于一个“完全加括号问题”,次数为卡特兰数,卡特兰数指数增长,必然不行。 令m[i][j... 阅读全文
posted @ 2013-04-14 22:23 加拿大小哥哥 编辑
摘要:1 /*贪心可能导致无解; 2 硬币系统是10,7,5,1元,那么12元用贪心法得到的硬币数为3,而最少硬币数是2。 3 对于此题,可以举个例子: 4 若有1,5,7,10这四种货币,则易知 5 1=1 6 2=1+1 7 3=1+1+1 8 …… 9 6=5+110 那么推下去可知11 表示12这个面值需要的货币数,等于表示11或7或5或2需要的货币数+1。12 那么题中若要求表示12所需用的最小货币数,只需寻找表示11或7或5或2需要的货币数中的最小值。13 14 */15 16 //硬币数... 阅读全文
posted @ 2013-04-13 20:26 加拿大小哥哥 编辑
摘要:1 /* 2 不是贪心,若是先按长排序在按宽,若是长很大宽很小 ,则若是后边款稍微大一些就不行了 3 */ 4 #include <stdio.h> 5 #include <iostream> 6 #include <cstring> 7 #include <algorithm> 8 using namespace std; 9 10 const int N = 1005;11 typedef struct Node12 {13 int a;14 int b;15 }Node;16 Node q[N];17 int n;18 int d[N];1 阅读全文
posted @ 2013-04-13 10:35 加拿大小哥哥 编辑
摘要:将字母A-Z编码,A为1,B为2,……依此类推,Z为26;则ABC编码为123。但是反向解码时,解码结果不唯一,比如123可以解码为 1-2-3:ABC,解码为12-3:LC,解码为1-23:AW(注意,127不能解码为1-27,因为范围只能为1-26)。现给出一组编码后的数字串,让你求该数字串可以有几种解码方式(上例中,123对应着3种解码方式)。问题输入将保证其为一个合法的数字串。比如100是 一个不合法的数字串,因为0或者00不代表一个字母;此外01不能视为1。 Sample Input25114 1111111111 3333333333 Sample Output6 89 1 1 / 阅读全文
posted @ 2012-09-15 13:37 加拿大小哥哥 编辑
摘要:Super Jumping! Jumping! Jumping!Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13479 Accepted Submission(s): 5626Problem DescriptionNowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a g 阅读全文
posted @ 2012-09-05 13:23 加拿大小哥哥 编辑
摘要:FatMouse and CheeseTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2812 Accepted Submission(s): 1089Problem DescriptionFatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is lab 阅读全文
posted @ 2012-08-29 22:18 加拿大小哥哥 编辑
摘要:矩形嵌套时间限制:3000 ms | 内存限制:65535 KB难度:4描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。输入第一行是一个正正数N(0<N<10),表示测试数据组数,每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)随后的n行,每行有两 阅读全文
posted @ 2012-08-23 16:54 加拿大小哥哥 编辑
摘要:搬寝室Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9687Accepted Submission(s): 3257Problem Description搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2*k件过去就行了.但还是会很累,因为2*k也不小是一个不大于n的 阅读全文
posted @ 2012-08-21 11:18 加拿大小哥哥 编辑
摘要:ZipperTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 13041Accepted: 4560DescriptionGiven three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in it 阅读全文
posted @ 2012-08-02 12:11 加拿大小哥哥 编辑
摘要:免费馅饼Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13077 Accepted Submission(s): 4328Problem Description都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他 阅读全文
posted @ 2012-07-01 01:02 加拿大小哥哥 编辑
摘要:/*大概思路是开2个数组,c1[ ]保存当前得到的多项式各项系数,c2[ ]保存每次计算时的临时结果,当每次计算完毕后,把它赋给c1,然后c2清零。计算的时候,开3层for循环。最外层,记录它正在与第几个多项式相乘。第二层,表示c1中的每一项,第三层表示后面被乘多项式中的每一项。*/#include <stdio.h>#include <string.h>const int MAX=120;int main(){ int n,c1[MAX+5],c2[MAX+5]; while(~scanf("%d",&n)) { memset(c1,0,s 阅读全文
posted @ 2012-06-25 00:27 加拿大小哥哥 编辑
摘要:Substring时间限制:1000 ms | 内存限制:65535 KB难度:1描述You are given a string input. You are to find the longest substring of input such that the reversal of the substring is also a substring of input. In case of a tie, return the string that occurs earliest in input.Note well: The substring and its reversal ma 阅读全文
posted @ 2012-06-12 13:44 加拿大小哥哥 编辑
摘要:#include<stdio.h>int main(){ int n,i,j,d[101][101]={0}; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=i;j++) { scanf("%d",&d[i][j]); d[i][j]+=(d[i-1][j-1]>d[i-1][j]?d[i-1][j-1]:d[i-1][j]); if(i==n&&d[n][j]>d[n][1]) d[n][1]=d[n][j]; } printf(" 阅读全文
posted @ 2012-06-07 23:30 加拿大小哥哥 编辑
摘要://参考大牛的代码,在stack中插入数据是有序的,而且是进行替换而不需要挪动——也就是说,我们可以使用二分查找,将每一个数字的插入时间优化到O(logN)#include<stdio.h>#define min -32769int stack[100001];//模拟栈,为了更形象int main(){ int T,i,num;int top,low,high,mid; while(~scanf("%d",&T)) { top=0;stack[0]=min; for(i=0;i<T;i++) { scanf("%d",& 阅读全文
posted @ 2012-05-25 23:59 加拿大小哥哥 编辑
摘要:#include<stdio.h>#include<string.h>#define N 10001#define MAX(m,n) ((m)>(n)?(m):(n))char a[N],b[N];int d[N][N];int cmp(const void *a,const void *b){ return *(char *)a-*(char *)b;}int My_Cancel(int len)/*删除相邻的同样数据,不相邻的并不删除,即aabbab,输出abab不是ab,成为单调递增,否则成为单调不减序列**/{ int i,j=0; for(i=0;i&l 阅读全文
posted @ 2012-05-24 13:04 加拿大小哥哥 编辑
摘要:1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 char str[10010]; 6 int ans[10010]; 7 8 int main() 9 {10 int i,j,k;11 int T;12 scanf("%d%*c",&T);13 while(T--)14 {15 memset(str,0,sizeof(str));16 memset(ans,0,sizeof(ans));17 18 scanf("%... 阅读全文
posted @ 2012-05-24 12:59 加拿大小哥哥 编辑
摘要:#include<stdio.h>#include<time.h>int max(int a,int b){ return a>b?a:b;}int main(){ /*time_t start=time(NULL),end;//此时输出的end-start是s,int类型无意义*/ int i,j,n,v,c,w; while(scanf("%d%d",&n,&v),n||v) { int b[1001]={0}; for(i=1;i<=n;i++) { scanf("%d%d",&c,&am 阅读全文
posted @ 2012-05-21 10:31 加拿大小哥哥 编辑
摘要:#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 1001int ans[N];int max(int a,int b){if(a>b) return a; return b; }int main(){ int n,v,c,w; int max(int,int); while(scanf("%d%d",&n,&v),n||v) { memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++) { sc 阅读全文
posted @ 2012-05-09 14:10 加拿大小哥哥 编辑
摘要:拦截导弹时间限制:3000 ms | 内存限制:65535 KB难度:3描述某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。输入第一行输入测试数据组数N(1<=N<=10)接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20)接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。输出输出最多能拦截的导弹数目样例输入28389 207 1 阅读全文
posted @ 2012-04-22 11:10 加拿大小哥哥 编辑
摘要:单调递增最长子序列时间限制:3000 ms | 内存限制:65535 KB 难度:4描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3aaaababcabklmncdefg样例输出 137 在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增 阅读全文
posted @ 2012-04-22 10:09 加拿大小哥哥 编辑

点击右上角即可分享
微信分享提示