随笔分类 - UVA
摘要:题意:有4种硬币,面值分别为c1,c2,c3,c4,然后给出Q组查询。每组查询给出5个数d1,d2,d3,d4,v,分别表示面值为ci的硬币共有di个,然后要求将其凑成总值为v的方案数。数据范围大致是c 2 typedef long long LL; 3 LL dp[100010]; 4 5 int main(){ 6 int c[4],d[4],v,Q,kase; 7 scanf("%d",&kase); 8 while(kase--){ 9 dp[0] = 1;10 for(int i = 1;i = 0) ans += fl...
        阅读全文
                
摘要:题意:给出两个数n,m,求n到m之间所有数字的所有数位上的数的和。好久不做这类题思路总是很凌乱。具体看代码吧。 1 #include 2 typedef long long LL; 3 LL dp(LL x){ 4 LL ret = 0; 5 LL p[11]; 6 p[0] = 1; 7 for(int i = 1;i = 0;pos--){16 for(int j = 0;j < idx[pos];j++){17 ret += (sum+j) * p[pos];18 if(pos) ret +...
        阅读全文
                
摘要:题意:问有多少个N(N 2 #include 3 typedef long long LL; 4 LL dp[70][70][101]; 5 LL pow_mod(LL a,LL p,LL n){ 6 if(p == 0) return 1; 7 LL ans = pow_mod(a,p/2,n); 8 ans = ans * ans % n; 9 if(p%2 == 1) ans = ans * a % n;10 return ans;11 }12 13 int main(){14 int nkase;15 scanf("%d...
        阅读全文
                
摘要:这是白书二代上的一个组合计数里面的一道练习题。我用的方法是枚举在x*y的方格中放置一条对角线,也可以理解为枚举斜率。如图,先来看这样一个问题,n=m=4,即此时有3行3列的方格的时候,可以放置斜率k=-1的直线有多少条。首先我们把每个格子都标上号。如图,我最多只能放置5条k=-1的直线。当我枚举在1*1的方格中放置对角线的时候(当然此时斜率k=-1),一共可以放置9条对角线。然而事实上斜率k=-1的对角线只需要5条就可以了,多出来了4条。那么是哪里多出来了这4条呢?我们注意看所有2*2的方格,他们多有的右下角的那条都是多余的。如图:很显然,我们需要删掉1245中的5,2356中的6,4578中
        阅读全文
                
摘要:用spfa做的时候 标记每个点的被松弛的次数 即可。View Code 1 #include <iostream> 2 #include <vector> 3 #include <cstring> 4 #include <queue> 5 #include <string> 6 #include <map> 7 #include <cstdio> 8 #define maxn 110 9 #define INF 1 << 30 10 using namespace std; 11 typedef p
        阅读全文
                
摘要:写的好搓啊。。新年第一水。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #define maxn 510 6 #define maxm 2710 7 using namespace std; 8 int v[maxm],w[maxm],next[maxm]; 9 int first[maxn],inq[maxn],cnt[maxn],d[maxn]; 10 int e,V,E; 11 12 void ini
        阅读全文
                
摘要:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <vector> 6 #define maxn 60 7 using namespace std; 8 vector<int> v,next; 9 vector<double> w; 10 double d[maxn]; 11 int first[maxn],inq[maxn],cnt[maxn]; 12 i
        阅读全文
                
摘要:虽然这个题写的很挫。但还是水一下。View Code 1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 #include <cstring> 5 #include <cstdio> 6 #define INF 1 << 20 7 using namespace std; 8 typedef pair<int,int> pii; 9 int N,S,E,M,K; 10 int G[505][505],f[505],g[505],T[101
        阅读全文
                
摘要:这个题写的。。有点纠结啊。主要是如果从某地运东西到一个城镇时,根据已知城镇的spoons的数量倒推回去求原来的那个地点spoons的数量有点点麻烦,这里处理好了就应该没有问题了。还有这个字典序的问题。。这里ASCII码越小,字典序越小。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 #include <vector> 5 #include <cstdio> 6 #define INF 0x3f3f3f3f3f3f3f3fLL 7 #de
        阅读全文
                
摘要:怒刷水题。。我说怎么会TLE 原来是自己记忆化搜索写挫了。。对比才知道dijkstra比bellman跑的快好多啊。View Code 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 #include <vector> 5 #include <cstdio> 6 #define maxn 1010 7 using namespace std; 8 typedef pair <int,int> pii; 9 int d[maxn],dp[maxn
        阅读全文
                
摘要:换行出错。WA了一次。。用a[i][j]表示从第i个主题上到第j个主题所需要的时间,d[i][0]表示上完第i个主题所需课时数的最小值,d[i][1]表示在上完第i个主题所需课时数最小的情况下,不满意度DI的最小值。下面贴代码:View Code 1 #include <stdio.h> 2 #include <string.h> 3 int a[1001][1001],d[1001][2],C,time; 4 int DI(int a) 5 { 6 if(a == time) 7 return 0; 8 if(time - a <= 10) 9 ...
        阅读全文
                
摘要:足足跑了2秒啊。。。贴代码:View Code 1 #include <stdio.h> 2 #include <string.h> 3 char str[1001]; 4 int dp[1001][1001],p[1001][1001]; 5 int DP(int x,int y) 6 { 7 int &ans = dp[x][y]; 8 if(ans != -1) 9 return ans;10 if(x >= y)11 {12 ans = 0;13 return ans;14 }15 if(...
        阅读全文
                
摘要:本题的这个状态转移方程真的是自己推出来的。。用dp(i,j)表示从第i个字符到第j个字符删去字符使得字符串为回文串的方法数,得到的状态转移方程是:if(str[i]==str[j]) dp(i,j)=dp(i,j-1)+dp(i+1,j)+1else dp(i,j)=dp(i,j-1)+dp(i+1,j)-dp(i+1,j-1)其中dp数组要用long long int,否则就会像我一样TLE。。下面简单讲一下我自己的思路。先讲if(str[i]!=str[j]) dp(i,j)=dp(i,j-1)+dp(i+1,j)-dp(i+1,j-1)当第i个字符跟第j个字符不相等时,首先,去掉第j..
        阅读全文
                
摘要:其实这个题目可以用原来的换硬币的方法来解决,但是这个题目是也是一个这样的问题:求把一个整数i最多拆分成j个数时的方法数。f[i][j]表示把一个整数i最多拆分成j个数时的方法数,f[0][0]=1;状态转移方程是f[i][j]=f[i-j][j]+f[i][j-1].下面贴代码:View Code 1 #include <stdio.h> 2 #include <string.h> 3 long long int f[301][301]; 4 char s[100]; 5 int main() 6 { 7 int a,b,c,i,j; 8 memset(f,0,size
        阅读全文
                
摘要:本题抄自staginner(斌哥)。。先做一下心得体会:我被这题虐了。。。。话说这题当时还是上个月看的。当然,抄完这题也真的很长见识的。有的时候,真的不是说想不出来,而是根本不敢去想,或者说没深入的去想这个问题,就直接把自己的假设枪毙了。先复述一下斌哥的思路:1.首先,我们需要知道,当力量较大的乌龟置于下面时,对这两只乌龟来说,他们的总体承重能力是肯定大于当力量较小的乌龟置于下面的时候的。这个可以简单的证明一下:假设力量大的乌龟的力量是s1,自重是w1;力量小的乌龟的力量是s2,自重是w2;(s1>s2)当力量较大的乌龟在下面时,假设他们的总体承重能力是A,那么A=min{s1-w1-w
        阅读全文
                
摘要:滚动数组滚过。贴代码:View Code 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int dp[31],p[1001],w[1001]; 5 int main() 6 { 7 int ncase; 8 cin>>ncase; 9 while(ncase--)10 {11 int N,G,i,j,temp,total = 0;12 cin>>N;13 for(i = 1;i <= N;i++)14 ...
        阅读全文
                
摘要:感觉这个DP好暴力的。。一开始没有想出来,后来百度了。。瞄了一眼,看到DP的记忆化搜索里面套了一个两个嵌套的for循环,才明白大概是个什么思路,原来,这里的DP用的那么暴力。本题用了两个DP来解决。大概的思路可以再记忆化搜索的过程中体现。还有,在输出0 0这样的数据的时候不用换行,百思不得其解。。这个还是百度出来的。最初在写记忆化搜索的时候,漏了一个&,改了半天,买个教训,后来改的都快跟人家的一模一样了,这个最悲剧了,核心部分是对的,然后改细节。。。下面贴代码:View Code 1 #include <iostream> 2 #include <cstdio>
        阅读全文
                
摘要:练习打印路径。。本题居然没有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
        阅读全文
                
摘要:这个题目的题意的理解起来应该不苦难。这个人吃汉堡,有两种,一种吃下去要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 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
        阅读全文
                
 
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号