04 2012 档案
摘要:练习打印路径。。本题居然没有PE,搞死我了。。后来还是参考了一位名为“加速!!!!!!!!!!”的好人的BLOG,自己改了半天才过了。思路就是dp[i][j][k]代表从(i,j)出发,到达最底层的权值之和为k的路径条数,细节方面小心点。哎~~贴代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 typedef long long int llg; 6 llg dp[50][50][501]; 7 int le
        阅读全文
                
摘要:DP写的,其过程比较艰难,贴一下代码:View Code 1 #include <stdio.h> 2 #include <string.h> 3 void add(char s1[],char s2[],char s3[]) 4 { 5 int len1 = strlen(s1); 6 int len2 = strlen(s2); 7 int a[10000]; 8 int k = len1 > len2 ? len1 : len2; 9 int i,j; 10 for(i = 0;i <= k;i++) 11 ...
        阅读全文
                
摘要:这个题目的题意的理解起来应该不苦难。这个人吃汉堡,有两种,一种吃下去要m分钟,另外一种吃下去要n分钟,给了t的时间如果他必须浪费时间,就要喝啤酒(注意题目后面有一句It is preferable that Homer drinks as little beer as possible),也就是说,在最好不要浪费时间的情况下,问他最多吃下去多少汉堡。所以就必须先来考虑时间,再来考虑吃下去汉堡的个数了。下面贴代码(当然,我写的好像有点罗嗦):View Code 1 #include <iostream> 2 #include <cstring> 3 using names
        阅读全文
                
摘要:水题痛彻我心扉,就这样。View Code 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a[14]; 6 int i,j,k,num = 2; 7 while(num <= 13) 8 { 9 if(num == 0)10 break;11 for(i = 1;;i++)12 {13 j = 0;14 k = num * 2;15 ...
        阅读全文
                
摘要:矩阵链乘,状态转移方程:dp(i,j)=min{dp(i,k)+dp(k+1,j)+a[i]*b[j]*b[k]}。这个题目主要就是要记录路径。做了那个ZOJ1463之后,这个应该不成问题。下面贴代码:View Code 1 #include <iostream> 2 using namespace std; 3 int dp[11][11],c[11][11],a[11],b[11],num; 4 void printans(int i,int j) 5 { 6 if(i == j) 7 { 8 cout<<"A"<<i; 9 }10 
        阅读全文
                
摘要:这个题目,筷子应该最好是非降序排列的(只要输入的时候处理一下即可),这样处理起来就比较方便,因为这样就可以保证在后来的计算中,每取两个筷子都有比他们两根长的筷子,就可以符合题意了。下面贴代码:View Code 1 #include <iostream> 2 using namespace std; 3 int dp[5050][1010]; 4 #define maxn 1<<30 5 int a[5050]; 6 int main() 7 { 8 9 int ncase,guests,chopsticks,i,j;10 cin>>ncase;11 whi
        阅读全文
                
摘要:题目本身,没什么好说的了。记得第一天练DP的时候就是叫我做的这个题,这个哪里做得出来啊。现在怎么说也比原来好点了。这个题实际上是跟POJ 1141是一样的,几乎一模一样。但是这个ZOJ太奇葩了,这个题目的输入让我无语了。后来我看了一下提交的结果。。提交了两千多次,没有PE,只有WA。。。这个就无语了,题目要求的那些空行让人凌乱啊。下面贴代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int MA
        阅读全文
                
摘要:其实跟这个很像UVA的一个coins,但是那个是对每个硬币的使用次数没有限制,这次对这个有限制了。这个限制怎么去破他,我想了好久好久。最终,还是没想出来,悲剧。后来网上搜了一下,发现这题还是楼教主的“男人不容易”系列中“男人八题”里的最简单的一道。 悲催了。记录面值的话,每个面值搜过去就是了。但是这个次数的限制,就需要用另外一种状态去表示他了。最核心的就是这个式子:if(used[j-a[i]]<c[i]) used[j]=used[j-a[i]]+1贴代码:View Code 1 #include <iostream> 2 #include <cstring> 
        阅读全文
                
摘要:这个题目拿到一看,马上就感觉又是带权的最长公共子序列的DP问题,觉得应该问题不大。真正动手一写,发现面对序列中不匹配的时候,处理起来好像很麻烦,一时没想到什么好办法。最后还是用的滚动数组绕开了原来的问题。下面贴代码:View Code 1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int a[101]; 5 double dp[101]; 6 int main() 7 { 8 int m,n,num,i,j; 9 double price;10 while(cin>>m
        阅读全文
                
摘要:第二次做自己学校OJ的题目,贡献了三个TLE,两个RE。。其实这是一道非常非常经典的DP题。题目的意思,在标程里面写的很清楚了:从数列中选取若干个数,使其和与M的差的绝对值最小。我开始想到的是那个分硬币的题。那种近乎暴力的方法,在这道题目上用,TLE了,因为这个数据的大小就是超了原来的想法,刚开始题目没看清楚,以为能过的。现在简述一下解决这个问题:从数列中选取若干个数,使其和与M的差的绝对值最小 的思路。我们用一个数组d[i][j]来表示/取到第i个数字时,在a[1],a[2]......,a[i]个中/任取若干个数/的和,使得/这个和/与j的差值/的绝对值/最小的时候/的这个差值。当i=0时
        阅读全文
                
摘要:还是水题。状态转移方程:dp(i,j)=min{dp(i,k)+dp(k,j)+a[i]a[j]a[k]}(i<k<j)。处理时注意边界即可。贴代码:View Code 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int d[101][101],a[101]; 5 int dp(int i,int j) 6 { 7 int &ans = d[i][j]; 8 int k,temp; 9 if(ans != -1)10 return ans;11 if(i...
        阅读全文
                
摘要:DP水题。最长公共子序列,稍稍变形即可。模型完全一样。View Code 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 #define MAX 2012 5 int dp[MAX][MAX],v[200]; 6 char a[MAX],b[MAX]; 7 int main() 8 { 9 int n,i,j;10 while(cin>>n)11 {12 char ch;13 int value;14 memset(v,0,sizeo...
        阅读全文
                
摘要:这个题目是上个礼拜天上午看的,纠结了一上午啊,总算还是有点思路,但是总是感觉到相当的混乱,感觉被伤到了一样。后来想想不必就为这么一个题目纠结,换一个吧。但是不纠结是不可能的。最终,还是没忍住,看了一下人家的解题报告,发现思路大致上还是对的,但是,细节方面处理的很烂,琢磨了半天,几乎都要把人家的代码背下来了。今天早上一起来,就决心把这个伤到我的题目弄掉,但是,因为一个小小的BUG,弄了好一下,我算是明白了,写点代码还是老实点的好啊,免得因为一个BUG要调试半天。。现在说正题。题目的意思是,老板需要雇人干活,雇佣一个人需要钱h,每个月需要支付他工资s,解雇他还要给他"买断”,需要支付f的
        阅读全文
                
摘要:题目大意:给你若干硬币,让你分成两份,使其绝对值之差尽量的小。很容易想到,我们需要枚举出这些硬币可能凑出的所有面值,那么,怎么去算出这些硬币可能凑出的面值就是我们需要解决的问题了。令dp[i]数组来保存是否可以凑出i的面值的结果。可以为1,否则为0.sum为这些硬币的面值之和。显然dp[0]=1,有一份一分钱都没有事肯定可以的。那么dp[sum]=1,有一份可以囊括所有的硬币。那么既然dp[0]是可以的,那么dp[0+coin[j]]也一定可以凑出来,同理dp[sum-coin[j]]也是可以的;如此推广下去,dp[coin[j]]可以,dp[coin[j]+coin[k]]也可以………………
        阅读全文
                
摘要:简单的DP,跟那个白书上面的嵌套矩形的模型完全一样。记忆化搜索。本人写的时候还是小心翼翼的,因为练的不是很多。题目就是搬砖啊,搬砖。。。生来就是搬砖的命啊。View Code 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 class Block 5 { 6 public: 7 int l; 8 int w; 9 int h; 10 }; 11 int edg[40][3];//记录每一块砖头的规格 12 int g[100][100];//邻接矩阵 13 i...
        阅读全文
                
摘要:这个题吧,其实对很多人来说真的是水题,但是~~我把这个题AC掉了,真的是付出了蛮大的代价的。虽然AC掉了,但是,这个方案肯定不是最好的,特别是保存路径,我开了三维的数组。思路其实很简单,就是有点象枚举,状态转移方程应该是dp[i][j]=a[i][j]+min{dp[t][i+1]}(t为与i相邻的行,相邻的话稍微处理一下就可以了)这个题目要求一定是要按字典序最小输出路径,所以说最好应该是从后往前递推的,否则麻烦就大了,我就是在这个上面吃了苦头,一开始以为无所谓的,从哪边来都可以的,后来发现问题了,就动了大手术啊,调试就太悲催了,各种BUG啊。可见,写代码之前一定要想清楚了。这道题,还是体现了
        阅读全文
                
摘要:这个题吧,其实跟那些个硬币问题还是差不多的。但是。。本菜鸟在做的时候因为精度的问题吃到了大苦头了,这个就相当悲剧了。这个问题在代码中有具体的体现。View Code 1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int coin[12] = {0,5,10,20,50,100,200,500,1000,2000,5000,10000}; 5 long long int a[30001][12]; 6 int main() 7 { 8 int i,j,k,cent; 9 double
        阅读全文
                
摘要:本题吧,经典的DP。本菜鸟第一次写解题报告,以前的题都没好意思写。求高手别喷。题目意思应该还是很明白的。就是一根木头,告诉你多长,要切几下,分别切在哪些个点。然后呢,切一根多长的木头,就要多少钱。然后求一个最便宜的切木有的方案。这个题目是跟白书配套的,看过那个9.4的最优矩阵链乘的话,就能够想到,其实这个题思路跟那个矩阵链乘一样的。核心的东西就是这个方程:dp(i,j)=min{dp(i,k)+dp(k,j)+c[j]-c[i]}(其中(i<k<j),k也就是切断第i个点跟第j个点之间的那段木头的那个点)最后稍注意一下边界的条件,当i+1=j的时候,就是已经切到极限的时候,dp(i
        阅读全文
                
 
                    
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号