POJ 3941
摘要:题意:给出n个有m面的骰子,扔一次,求出和,如果和小于等于k,就记1,否则就是和减去k,求最后期望。题解:用滚动数组dp[2][MAX]记录当前扔到某个数的情况种数,然后......挺水的。。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 const int N=10005; 7 int dp[2][N]; 8 int main() 9 {10 int n,m,k;11
阅读全文
POJ 1682
摘要:题意:一个三角形水域,每条边上住着n,m,k户人,他们要互相连通就得架桥,桥必须满足两个条件:1、互相不交叉。2、每一户人家都必须有至少一座桥。桥的代价为两户人家海拔高度之差,求此情况下的最优架桥方案代价。题解:类似于一道经典DP,忘了是哪个了,可以将三角区域看成三角形,分别对三个角进行dp,方案如下: 1、对于角A,它关联的两条边分住着x1,x2...xn和zk,zk-1....z1这些人家,那么dpa[i][j]代表xi户人与zj户人搭桥且所有<i的x与所有大于j的z均已成功搭建好桥的最小代价,B,C角类似处理。 2、枚举dpa[i][j],即从A开始,最远的zj与xi之间建的桥,.
阅读全文
POJ 2978
摘要:题意:给定m个数字,有k种,求从中扔掉最少多少个,使得最后相同种类的数字都在一起。题解:状态压缩DP,并不算太复杂,dp[i][j][mask]代表前i个珠子,以j结尾,且前面已经出现了mask珠子的最小代价。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int dp[105][6][40]; 6 const int inf=0x3f3f3f3f; 7 int main() 8 { 9 int n,k;10 whi
阅读全文
POJ 1671
摘要:题意:太难翻译了。。。只可意会,不可言传。。。题解:dp[i][j]为长度为i且含j个不同节拍的方法种数,那么dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j,即多出的节拍独自一种或者与前面某种相同。后来证实,这就是第二类string数View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 double dp[100][100]; 6 int main() 7 { 8 memset(dp,0,sizeof
阅读全文
POJ 1636
摘要:题意:都含有m个犯人的两个监狱要等量交换至多[m/2]个犯人,约数条件是监狱A的第i个犯人不能和监狱B的第j个犯人在同一个监狱,问小于且最接近[m/2]的交换人数。题解:1、为了方便,让B监狱的犯人编号从m+1开始。可以看出,交换的图是一个二分图,如果左边的第i个点不能和第j个点共处,那么就让它们连一条边,将边连完之后,满足约数条件的交换实际上就是同属于一个连通分量的所有左右的两边的点进行交换,否则,必然会有矛盾出现。 2、记录1中所有的这种情况,即合法交换需要用多少个A监狱的人去换多少个B监狱的人。 3、dp[a][b]代表A监狱交换了a个人,B监狱交换了b个人是否可行,转移方程就是...
阅读全文
POJ 3612
摘要:题意:n个序列,权值为相邻差值的绝对值之和*c。可以给每个数添加一个x,代价为x*x。求最小权。题解:dp[i][j]为第i个数为j时的最小代价,转移时分两种情况,如果i-1的高度小于j,那么dp[i][j]=dp[i-1][k]+(a[i]-j)^2+(j-k)*c=(a[i]-j)^2+j*c+(dp[i-1][k]-k*c),记录所有小于j的dp[i-1][k]-k*c最小值为low[j],转移复杂度就变成1了,如果i-1高度不低于j,也同上,只是将-k*c改成了+k*c,j*c变成-j*cView Code 1 #include<cstdio> 2 #include<
阅读全文
POJ 2228
摘要:题意:有头牛喜欢睡觉,一天被其分成了n(3<=n<=3830)份,它可以选择至多m份(2<=m<n)进行睡觉。每个时间段睡觉所得的收益不同,且它每次睡觉都必须花一份时间来入睡(算在m中,但是却没有收益),每天被视为一个环,即如果第n份没有在入睡或者熟睡状态,第一份时间就不能是熟睡状态,求最大收益。题解:1、dp[n][m][0,1,2]分别代表第n天,睡了m份时间且第n天分别是醒着、入睡、熟睡状态时的最大收益,为了防止空间溢出,可以通过辗转更新来节省。 2、显然,dp[i][j][0]->dp[i+1][j][0]、dp[i+1][j+1][1];dp[i][j]
阅读全文
POJ 3486
摘要:题意:需要n年都有电脑用,有两种方法,一种是修理电脑,一种是换新电脑。一台新电脑价值为c,第i台电脑在第i年发行,将它维修至第j年的费用会告诉你,求最低消费。题解:dp[i]为前i年都有电脑用的最小花费,那么dp[i]=min(dp[j-1]+c+a[j][i]),即前j-1年有电脑用的最小花费加上买第j年电脑一直用到第i年的花费中取一个最小值。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=
阅读全文
POJ 2662
摘要:题意:求无向图中从1走到2的满足条件的路径条数,条件:从A能到B,当且仅当B到终点的最短路径小于A到终点的最短路径。题解:spfa预处理所有点到终点的距离,记忆化搜索统计个数。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=1005,M=4000000; 6 int dist[N],head[N],list[N],dp[N],r,f,nc; 7 bool vis[N]; 8 struct Ed
阅读全文
POJ 2441
摘要:题意:n头牛,m个牧场,每头牛都有自己喜欢的牧场,然后问一牛一牧场的分配方案总数。题解:状态压缩dp,dp[i][state]为前i头牛,用了state的牧场时的总数。但是直接开n*2^m会爆空间,但是每头牛都只与前面一头牛相关,所以可以辗转一下,只记录两维即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int dp[2][(1<<20)+2]; 6 int main() 7 { 8 int n,m
阅读全文
POJ 2261
摘要:题意:16个国家的竞赛图,给出每个国家打败其他国家的概率,求每个国家最后夺冠的概率。题解:dp[i][k]代表第i个国家成功进入第k轮的概率,那么dp[i][k]=sum(dp[i][k-1]*dp[j][k-1]*vs[i][j]),其中,j为这一轮i可能面对的国家。PS:国家名字占10个字符,还需要空一格再输出概率~View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 char name[20][50]; 6 doub
阅读全文
POJ 3682
摘要:题意:一场宴会,将会一直举办直到硬币投出第k次正面向上,正面向上的概率为p。另外,第i天的宴会将会花费2i-1的钱,问最后宴会结束期望以及花钱期望。题解:递推求期望,设dp1[i]为已经抛出i次正面时,结束时间的期望,dp2[i]为已经抛出i次正面时,结束金钱的期望。dp1[i]=(dp1[i]+1)*(1-p)+dp1[i+1]*p ==> dp1[i]=dp[i+1]+1/p假设宴会会矩形m天,第一天花费1,第二天花费3.......等价于第m天花费1,第m-1天花费3......所以,有了dp1,dp2[i]=(dp2[i+1]+(dp1[i+1]+1)*2-1)*p+(dp2[i
阅读全文
POJ 1283
摘要:题意:实际上就是将n拆分成m个数,不计顺序,且不允许为空,求总数。题解:dp[i][j]代表将j分成i份的种数(i>j时为0),那么dp[i][j]=dp[i-1][j-1]+dp[i][j-i],即分为两类,一类必须含有1,一类不含1。View Code 1 import java.math.*; 2 import java.util.Scanner; 3 class Main{ 4 static BigInteger dp[][]=new BigInteger[205][205]; 5 public static void main(String[] args) { 6 ...
阅读全文
POJ 3345
摘要:题意:一个国家想贿赂至少m个国家,给出贿赂每个国家需要的钱及他们的附属关系。如果贿赂了主国,其从属国家也同样视为被贿赂了,且关系网无环。题解:树形DP,dp[now][i]为以第now国家为子树的国家团体贿赂了i个国家所需要的最小花费,在建立一个虚拟结点0,让它与所有主国建立一条边。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<map> 5 #include<string> 6 using namespace std;
阅读全文
POJ 2137
摘要:题意:n(<=100)头牛各自有s(<=40)个自己喜欢的地方,FJ要把它们用绳子连成一个圈,但是每头牛都要在自己喜欢的地方之一才行,问FJ最少要用多长的绳子才行。题解:有于数据都比较小,所以可以dp[i][j][k]代表第i头牛在j处吃草时第1头牛在k处的最小绳子,最后答案等于dp[n][i][j]+dist(0,j,n,i)的最小值。转移是s的复杂度,最后就是O(n*s^3)View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<
阅读全文
POJ 3390
摘要:题意:每行限制宽度为m,然后给出n个单词的长度,将它们排版,每行不得超过m。最后对于每一行,如果不满m,则会有(m-len)^2的惩罚,求最小惩罚。(每两个单词之间会有一个空格,每行最后一个单词没有空格)题解:dp[i]代表将前i个单词排好所花费的代价,sum[i]代表前i个单词的总长度,那么dp[i]=min(dp[j]+(m-(sum[i]-sum[j]+i-j-1))),j<i且满足sum[i]-sum[j]+i-j-1<=m,由于m<=100,所以nm的复杂度还是可以接受的。View Code 1 #include<cstdio> 2 #include&l
阅读全文
POJ 1090
摘要:题意:一个01序列,改变第k位的条件是第k-1位是1并且前k-2位全是0,求使01序列全变成0的最小步骤。题解:通过举几个使00...1变成00...0的例子可以发现,长度为i最后一位为1的最小步骤实际就是它的(2^i)-1,于是dp[i][0]代表前i位全为0的最小代价,dp[i][1]代表前i-1位为0,第i位为1的最小代价。 若第i位本身是1,则dp[i][1]=dp[i-1][0],dp[i][0]=dp[i-1][1]+1+2^(i-1)-1=dp[i-1][1]+2^(i-1); 若第i位本身是0,则dp[i][0]=dp[i-1][0],dp[i][1]=dp[i-1][...
阅读全文
POJ 1732
摘要:题意:每个小写字母对应一个数字,然后给你一串数字和一些单词,找出一些单词对应这些数字,并且使得用的单词数最少。题解:dp[i]代表覆盖住前i个数字的最小花费,如果s能覆该[i,j]则dp[j]=min(dp[j],dp[i-1]+1),判断能否覆盖方法就多了KMP/HASH/AC自动机都行,map也可以水过。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<map> 4 #include<string> 5 using namespace std; 6 const int in
阅读全文
POJ 2010
摘要:题意:奶牛学校招生,c头奶牛报名,要选n头(n为奇数),学校是义务制,所以每头奶牛的学费都由学校负责。每头奶牛都由自己的考试分数和它需要花的学费,学校总共有f的资金,问合法招生方案中中间分数(即排名第(n+1)/2)最高的是多少。题解:先将所有的奶牛按照分数由高到低排序,假设k是招的奶牛中排名中间的那头,按照排序可知,[1,k-1]中的奶牛必定被招了(n-1)/2头,[k+1,c]中也必定被招了(n-1)/2头,而且无论招的是谁,分数是怎么样,最后影响结果的都只是k的分数。于是,可以预处理dpl[i]代表[1,i]头牛中选出(n-1)/2头牛的最小花费,dpr[i]代表[i,c]头牛中选出(n
阅读全文
POJ 3639
摘要:题意:初始有加拿大的$1000,给出每天一个美国美元与加拿大美元的兑换率,每次兑换需要花费3%的手续费,并且还会把小于美分的给省去,问最后最多有多少加拿大美元。题解:dp[i][0]为第i天最多有多少加拿大美元,dp[i][1]为第i天最多有多少美国美元,dp[i][0]=max(dp[i-1][0],update(dp[i-1][1]*per*0.97)); dp[i][1]=max(update(dp[i-1][0]/per*0.97),dp[i-1][1]);update是舍去美分以下的数。View Code 1 #include<cstdio> 2 #inclu...
阅读全文
|
|
|