
动态规划
文章平均质量分 54
徐州牧
这个作者很懒,什么都没留下…
展开
-
poj解题报告——3046
动态规划,题意:T种蚂蚁,共计A只,种类没有区别,问含有x只蚂蚁的子集有多少种(x∈[S,B]),看完题目就可以确定方法了。代码如下#include#include#define MAXD 1010#define MAXM 100010#define D 1000000int h[MAXD],wa[MAXM],wb[MAXM],A,B,S,T,*a,*b;voi原创 2014-12-20 21:55:15 · 486 阅读 · 0 评论 -
poj解题报告——3034
题意:在一个n*n的矩阵中,每个(x,y)坐标有个洞,在任意时刻(从上一时刻开始到目前时刻结束),任意位置可能会探出一个鼹鼠的头,如果用锤子打中即得一分,锤子活动的范围是以d(1=<d<=5)为半径的圆中可到达的坐标点,并且是直线移动,锤子可以移动到任意位置,同一时间同一 地点不可能出现两只鼹鼠,给出 鼹鼠这一局的出现方式,求出最多可以得多少分。 题解:动态规划,最优结果由子问题的原创 2015-02-24 14:38:17 · 528 阅读 · 0 评论 -
poj解题报告——3176
这题是一个简单的dp问题,暴力求解。代码如下#includeint dp[352][352];int dat[352][352];int max(int x,int y){ return x>y?x:y;}void main(){ int i,j,n,t; scanf("%d",&n); for(i=1;i<=n;i++) { for(j=1;j<=i;j+原创 2015-02-13 11:40:36 · 387 阅读 · 0 评论 -
poj解题报告——1159
做这题的时候网上荡了个公式:最少需要补充的字母数=原序列S的长度—S和S'的最长公共子串长度//其中s'为s的逆序。不要问我为什么,我也不知道是为什么。大神们没说,我还要再想想。代码如下#include#includevoid main(){ char a[5005],b[5005]; int c[2][5005]; int n,i,j; scanf("%d",&n);原创 2015-02-15 12:27:13 · 514 阅读 · 0 评论 -
poj解题报告——1080
这种题目总是要先打表,再化归,dp问题,取最大。代码如下#include#include#define N 1005int dp[N][N];int score[200][200];int max(int a,int b){ return a>b?a:b;}void init() { score['A']['A']=score['C']['C']=score['G原创 2015-02-14 14:25:09 · 424 阅读 · 0 评论 -
poj解题报告——1953
原本以为题目有点难度,要用排列组合做,但当我写几个数之后,就呵呵了 比如输入3,结果是000,001,010,100,101,所以答案是5,不能有连续的1; 再如输入4,结果是0000,0001,0010,0100,1000,0101,1010,1001,答案是8,这让我想到斐波那契数列,优化了解题方法#includeint a[1010]={0,2,3原创 2015-07-26 11:43:53 · 604 阅读 · 0 评论 -
poj解题报告——1579
根据要求写状态方程,相当于一个深搜。#include#include#includeusing namespace std;int dp[25][25][25];int dfs(int a,int b,int c){ if(a<=0||b<=0||c<=0) return 1; if(a>20||b>20||c>20) retur原创 2015-07-25 10:49:21 · 494 阅读 · 0 评论 -
poj解题报告——3254
状态压缩dp。 题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问有多少种放法。分析:假如知道第 i-1 行的所有的可以放的情况,那么对于第 i 行的可以放的一种情况,只要判断它和 i - 1 行的所有情况的能不能满足题目的所有牛不相邻,如果有种中满足, 那么对于 i 行的这一中情况有 x 中放法。原创 2015-07-12 14:16:53 · 415 阅读 · 0 评论 -
poj解题报告——1185
本题与poj3254差不多,所以分析手法不多讲,直接看代码#includeusing namespace std;int f[105][62][62],b[1050];bool a[105][12];int i,j,k,t,l,m,n,tot=0,ans;int isok(int row,int x,int y,int z){ int i,ans=0; x=b[原创 2015-07-13 16:00:32 · 534 阅读 · 0 评论 -
poj解题报告——1050
在一维情况下最大连续子段和的求法是从左到有顺序扫描数据,以0为边界,当累加和小于0时则重置为0.动态规划的状态转移方程为s=max{si-1+ai,ai},该方程和前面的描述是等价的。本题是对一维最大子段和的扩展,思路是从上到下找出所有的连续行(如第i行到第j行),然后计算每列从第i行到第j行的和,之后对这n个列的和进行一维最大子段和的计算,并找出最大的值。#include#define M原创 2015-07-14 14:12:26 · 700 阅读 · 0 评论 -
poj解题报告——1037
题意:给定长度依次为1到n的木棒n个, 摆放规则为除了两边的木棒,剩下的木棒必须要比相邻的两个都高或者都低。求从小到大排列的第c个序列。 题解:状态方程dp[i][j][0]用来求在i个木棒中以第j根木棒打头且前两根为升序的排列方案数, dp[i][j][1]用来求在i个木棒中以第j根木棒打头且前两根为降序的排列方案数#include#include#define m原创 2015-07-15 15:34:47 · 502 阅读 · 0 评论 -
poj解题报告——1836
这题要求最长上升子序列和最长下降子序列,除了最高的部分能出现等高,其他部分不行。代码如下#include#includevoid main(){ int n,i,j,result,m,up[1005],down[1005]; double a[1005]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { sca原创 2015-02-10 16:00:03 · 383 阅读 · 0 评论 -
poj解题报告——1088
思路:用一个二维数组arr来保存滑雪场地的地形图,再用另外一个二维数dp[i][j]来记录从图中某一个点的位置开始向四周延伸所能达到的最大深度。对于每一个点都从上下左右四个方向来搜索,如果有比当前点高度低的位置,那么就沿着个方向搜下去,依次再向其它方向搜索,最后比较四个方向上搜索到的深度取最大的然后+1后赋给当前位置的dp[i][j];公式就是dp[i][j]=max{dp[i-1][j],dp[原创 2015-02-25 11:49:15 · 455 阅读 · 0 评论 -
poj解题报告——1837
天平问题给一个天平,并且上面有许多的钩子(不是两个),前面以为一次性只能选两个钩子,结果不知道怎么下手,后来看清题目了才知道。然后有许多砝码,问把砝码加上去达到平衡状态的方案数。测试用例分析:2 4 代表有在天平上有两个钩子,砝码有四种-2 3 钩子的位置,负数代表在左边,正数代表在右边3 4原创 2014-12-26 22:45:48 · 356 阅读 · 0 评论 -
poj解题报告——1276
题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数 思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的。代码如下#include#includeint dp[110000],num[100100],s[2000][2];void main(){ int cash,n,i,j;原创 2014-12-27 22:24:27 · 525 阅读 · 0 评论 -
poj解题报告——3267
题意:给定字符串msg,再给定W个单词,要求从s中去掉最少的字符后能够被这些单词表示。求最少去掉多少字符。用d[ i ]表示从msg[ 0~i ]中最少去掉字符的个数, remove [ j, k ] 表示msg[ j~k ] 中包含了某个单词后去掉的字符个数。状态转移方程就为d[ i ]= min(d[ j-1]+remove[ j, i ] ),0 代码如下#include #原创 2014-12-27 23:23:25 · 463 阅读 · 0 评论 -
poj解题报告——1191
这题动态规划,太难了,参考了别人的思路,写了这份报告。 分析一下,根据题意,要求均方差ans = sqrt(Sum((x[i]-x的平均值)^2)/n),ans^2=Sum(x[i]*x[i])/n-(x的平均值)^2,而x的平均值是固定值(即所有方格数字的和/n),所以只要使得切割后的矩形的总分的平方和尽量小,由于切割只能沿着棋盘的边进行,故对于左上角坐标为[x1,y1],右下原创 2015-02-17 14:45:52 · 435 阅读 · 0 评论 -
poj解题报告——2029
题目大意:给出w为宽,h为高的一个长方形,里面有n个点,给出每个点的坐标,最后给出s为宽,t为高的一个长方形,问用这个长方形最多可以围住多少个点。数据范围很小,可以直接计算map[i][j]记录从(1,1)到(i,j)的长方形中的点数。map[i][j] - map[i-t][j] - map[i][j-s] + map[i-t][j-s]得到一个端点为ij的小长方形,找出所有长方形的最大值。原创 2015-02-21 21:18:14 · 539 阅读 · 0 评论 -
poj解题报告——1925
题意:给定n个塔的横坐标和高度,保证高度各不相同且横坐标递增,蜘蛛侠可以向一个塔射蛛丝然后荡到当前的相对位置,求最少要用多少次蛛丝。 分析:dp[i]代表着当他到x轴i的位置时最少摇摆了几次。因为每次摇摆他都到了关于被他蛛网固定的建筑的对称位置。那么他的高度在每次切换建筑目标时都是不变的。代码如下#include#include#includeint min(i原创 2015-02-23 08:44:57 · 581 阅读 · 0 评论 -
poj解题报告——2948
题意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少。如图,最北边有bloggium的收集站,最西边有 yeyenum 的收集站。现在要你在这些格子上面安装向北或者向西的传送带(每个格子自能装一种)。问最多能采到多少矿(yeyenum+bloggium)? 分析:每个格子只能向西或者向北,某个格子假如被选定向西,那么它所在原创 2015-02-22 11:45:04 · 535 阅读 · 0 评论 -
poj解题报告——3280
题意:给你一串字符,通过添加删除其中的一部分,使其变成一个回文串,并且花费最小(添加删除都有权值) 分析:删除一个字符和添加一个字符是等价的,考虑最小即可,设dp[i][j]表示在区间i j范围内构成回文的最小花费,if 当前匹配的两个字符相等,str[i] == str[j] 那么dp[i][j] = dp[i+1][j-1];else则把左边添加删除一个右边的值 或者在右原创 2015-02-20 08:52:58 · 454 阅读 · 0 评论 -
poj解题报告——2533
这题是最长上升子序列,去年暑假集训的时候老师讲过这种题的算法,这回算是练练手吧。代码如下#includevoid main(){ int a[1005],b[1005],i,j,n,max; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); b[i]=1; } for(i=0;i<n;i++) {原创 2015-02-12 11:46:57 · 371 阅读 · 0 评论 -
poj解题报告——1260
本题四个着眼点 (1) 要求要买的珍珠的数量是一定的 (2)所买的珍珠的质量允许提高,但不允许下降 (3)输入时,后输入的珍珠价格一定比前面输入的要贵 (4) 由(2)(3)知,珍珠的替代必须是连续的,不能跳跃替代代码如下#include#includeint min(int x,int y){ return x<y?x:原创 2015-02-11 10:26:32 · 424 阅读 · 0 评论 -
poj解题报告——1458
这就是一道公共最长子序列问题。#includeusing namespace std;#define MAXV 1000int same(int a,int b){ return a==b?1:0;}int max(int a,int b,int c){ if(a>=b&&a>=c) return a; if(b>=a&&b>=c) return b; re原创 2015-07-24 19:03:24 · 477 阅读 · 0 评论