DP
傻笨
这个作者很懒,什么都没留下…
展开
-
HDU 1176 基础DP
由于刚开始搞DP,看了一下大牛的思路,才写出这题,这题中这人移动有三种方法,要么不移动,要么向左移动,要么向右移动,那么 用a[i][j]表示的是在i秒j点有多少个饼掉下来,f[i][j]表示的是直到在i秒j点一共接到多少个饼,就可以写出一个状态方程,也就是关键解题思路: f[i][j]=max(f[i-1][j-1],f[i-1][j],f[i-1][j+1])+a[i][j];原创 2013-10-08 19:51:03 · 521 阅读 · 0 评论 -
HDU 1257 最长上升子序列
#include #include #include #include using namespace std; const int maxn=30005; int n,a[maxn],f[maxn]; int bsearch(int* f,int size,int& a) { int left=0; int right=size-1; while(left<=原创 2013-12-06 19:10:39 · 669 阅读 · 0 评论 -
HDU 1025 最大递增子序列长度
这道题目一开始我的是复杂度为 n^2的DP,发现超时了,于是去学了, nlgn的DP+二分的方法,一开始样例过了,我还以为自己写对了,后来 交上去却WA了,原来对这个还是理解不是太深,写起来有个地方没有理解清楚 后来慢慢看懂了!!!! 其实这个原理很简单,就是先比较一头一尾,然后进行二分,找到其中第一个比他大的数,然后拿这个数 替换掉那个比他大的数,一直进行这样,时间就会减少!!!!原创 2013-12-06 18:57:58 · 520 阅读 · 0 评论 -
RQNOJ 金明的预算方案 (分组背包)
这道题目 意思要好好看,好好研究一下,然后慢慢想想,你会发现比较简单!我一开始没有做出来, 然后看了大牛的博客,那天晚上不知道怎么死都看不进去,看不懂,第二天我先好好看了一下题目, 发现了这句话(q是所属主件的编号), 其实这道题目是在另外一道简单的 01背包上改编而来的,原题大概意思是: 告诉 N和M;N表示总钱数,M表示希望购买物品的个数; 然后就是从第2行到第m+1行,第j行给出了编号为j-原创 2013-10-13 11:54:11 · 808 阅读 · 0 评论 -
Codeforces Round #119 (Div. 2) A题
/* 当我看到这题时,我懂意思了,题意就是:给你一条长度n的丝带,然后让你切断,但是切断 后的丝带长度必须是给出的三个数据中的长度。 题目意思很简单,可我却没有什么思路,傻逼了,后来看了别人的解题报告, 发现自己真心好水啊!!抓狂!!! 暴力来做,也叫枚举,先枚举 a 和 b 的数量 然后再算 C 数量,然后进行比较 就可以计算出结果!!! */ #incl原创 2013-10-11 17:28:40 · 538 阅读 · 0 评论 -
HDU 1423 最大公共递增子序列长度
#include #include int a[510],b[510]; int dp[510];//这个数组表示每个i位置的最大公共递增子序列的长度 int main() { int t,m,n,i,j; scanf("%d",&t); while(t--) { scanf("%d",&m); for(i=1; i<=m; i++)原创 2013-10-10 22:33:28 · 470 阅读 · 0 评论 -
HDU 1159 && poj 1458
这是两道最简单的最基础的求最大公共子序列的长度: /* 对于求最大公共子序列长度 if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1;//这里比较好理解,当a[i-1]==b[j-1],那么自然dp[i][j]+1 }原创 2013-10-10 16:42:21 · 546 阅读 · 0 评论 -
HDU 1069 DP
/* 这题题目大意是:输入一个 n ,然后n组 a b c,然后让你随意组成长方形, 然后求出你组合的这些长方形叠起来的最大高度,能够叠起来的条件是( xx>x,yy>y); 思路:因为一组数据就可以有6种组合,所以可以把所有的组合弄出来, 然后按照 x的大小排序,然后从最大的x这种长方形作为基底, */ #include #include #inc原创 2013-10-09 17:15:36 · 478 阅读 · 0 评论 -
HDU 1058
#include #include #include #include using namespace std; int a[5850]; int n; int min1(int a1,int a2,int a3,int a4) { if(a1<=a2&&a1<=a3&&a1<=a4)return a1; else if(a2<=a1&&a2<=a3&&a2<=原创 2013-10-08 21:08:57 · 583 阅读 · 0 评论 -
HDU 2084 基础DP
这题思路就是从倒数第二层往上推,因为这题只能从相邻走,所以只有两种选择,同样也有一个状态转移方程: a[i][j] += max(a[i+1][j],a[i+1][j+1]) #include #include #include #include using namespace std; const int maxn=105; int a[maxn][max原创 2013-10-08 20:14:45 · 585 阅读 · 0 评论 -
HDU 1087 最大子序列和
#include #include #include #include using namespace std; const int maxx=1005; int n,a[maxx],dp[maxx]; int main() { int maxn; while(scanf("%d",&n),n) { memset(dp,0,sizeof(dp));原创 2013-12-06 20:29:14 · 577 阅读 · 0 评论