dp
文章平均质量分 50
IQ_IT
这个作者很懒,什么都没留下…
展开
-
hdu1257 最少拦截系统
求一个序列中不升子序列的个数,贪心思想。和南京理工大学第八届校赛sequence相似,那个题求的是不降子序列个数,可以看一下加深理解题目链接。 下面是本题代码: #include #include #include using namespace std; const int maxn=30000; int dp[1010],m; int main() { int n,b;原创 2016-05-02 20:59:10 · 256 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus
题意:在一个序列中,求出m个不想交的子序列,使这m个序列的和最大。 题意好理解,但递归方程的表示有些令我迷茫看了下大牛们的题解,在这里说一下我的看法。 这里我结合代码来说一下: dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j] ) 0 dp[i][j]表示前j个数分成i组时的最大值; dp[i][j-1]+a[j]表原创 2016-05-02 16:20:29 · 437 阅读 · 0 评论 -
hdu 1029 Ignatius and the Princess IV
#include #include #include #include using namespace std; int dp[1000010]; int main() { int n,b,num; while(scanf("%d",&n)!=EOF) { num=0; memset(dp,0,sizeof(dp)); int原创 2016-05-02 16:36:45 · 334 阅读 · 0 评论 -
hdu 1069 Monkey and Banana
题意:每行给三个数,可以任意选择为长宽高,求长宽递减,高度和最大的排序方式的高度和。 思路就是把所有情况列出来,然后套最长子序列模板就可以了。 每行数据可以分成三种情况,开始不理解长度为何取最大值(除去已选的高度值),后来才理解,如果不取最大值,一行数据就不止3种情况了。 #include #include #include #include using namespace std; str原创 2016-05-02 17:58:17 · 350 阅读 · 0 评论 -
hdu 1087 Super Jumping! Jumping! Jumping!
又是一道模板题!! #include #include const int maxn=1010; int a[maxn],dp[maxn],m,Max; void LICS() { memset(dp,0,sizeof(dp)); for(int i=0;i<m;i++) { dp[i]=a[i]; for(int j=0;j<i;j++) if(a[原创 2016-05-02 18:08:20 · 297 阅读 · 0 评论 -
hdu 1114 Piggy-Bank
01背包:一定空间内,每种价值的物品有一个 完全背包:一定空间内,每种价值的物品可以选无限个 多重背包:01背包和完全背包的组合。 由题意可知此题为完全背包,然后。。。。套模板 #include #include using namespace std; int f[100000]; //根据题意,记录f[i]在用了i空间的情况下的最小价值 int main() { int t原创 2016-05-02 18:27:07 · 291 阅读 · 0 评论 -
南京理工校赛 sequence
思路:求一个序列中不降子序列的个数,贪心思想,动规求解 #include #include #include using namespace std; int dp[10100],m; int main() { int n,b,t; cin>>t; while(t--) { scanf("%d",&n); m=0;原创 2016-05-02 18:50:25 · 302 阅读 · 0 评论 -
hdu 1260 Tickets
本题考虑当前的人是否和前面的人一起买票,所以有两种可能 动规方程:dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]); 代码如下: #include #include #include #include using namespace std; int a[2010],b[2010]; int dp[2010]; int main() { int t原创 2016-05-02 20:49:14 · 338 阅读 · 0 评论 -
POJ 2955 Brackets
题意:括号匹配,两个括号能匹配上,和就加二。 一道区间dp题,刚刚入门,说一下区间dp的思路,就是:不断遍历整个区间,第一次遍历求出子区间长度为1的区间的最大值,第二次遍历求出子区间长度为2的区间的最大值,以此类推,直到求出区间长度为整个区间的最大值。原创 2016-05-03 14:58:30 · 359 阅读 · 0 评论 -
POJ 1651 Multiplication Puzzle
题意:给你一排数(用数组a表示),最边上的两个数不动,将中间的数全部取出,且每次去一个数。每取一个数a[i],sum就加上三个数的乘积(此时与a[i]相邻的两个数以及a[i])。求最小的sum。 区间dp; 思路:一段区间a[i]——a[j]中取一个数a[k],若能实现a[i]*a[k]*a[j],则i到k以及k到j之间的数都已取出,若以dp[i][j]记录sum的最小值,则 dp[i][j原创 2016-05-04 16:20:21 · 303 阅读 · 0 评论 -
hdu 1176 免费馅饼
这道题题解有很多,但我发现大多数都是错误的,下面是我的理解,恭迎大牛来判别正误。 下面我就列举错误代码: #include #include #include #include using namespace std ; int a [ 100001 ] [ 12 ] ; int f [ 100001 ] [ 12 ] ; int main () { int n ; while原创 2016-05-02 20:26:40 · 586 阅读 · 0 评论 -
hdu 1160 FatMouse's Speed
题目大意就是求出两条件分别满足上升和下降的最长子序列。 解题思路:结构上套模板,细节上的区别有 1、想将一个条件排好序,相当于已经判别了一个条件; 2,、因为题目要求的是每个数在原序列的位置,所以需要在结构体中提前记录位置,以便于排序后仍能找到位置。另一点是在寻找最长子序列时,记录是由前面哪一个字符发展而来的,以便于能够知道各在排序后的位置。 #include #include #inc原创 2016-05-02 15:13:56 · 355 阅读 · 0 评论