![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
peterdujinzhao
在路上
展开
-
练习三 1019
概述:题目是真的没有怎么看懂,但是可以看出这是一道基础多重背包问题。思路:由于当时还没有怎么了解多重背包,所以直接将其转化为了01背包来做,并且二进制分解都没用,所幸数据较小,没有超时。感想:当时只自学了01背包,,,一切以01来做。#include #include #include using namespace std;int dp[255555];int va[500原创 2016-05-28 15:37:47 · 244 阅读 · 0 评论 -
练习三 1017
概述:一个骨头收集者沿路收集骨头,每个骨头有价值和重量,收集者的背包容量有限,问他能收集的骨头的最大价值.思路:01背包模板问题.感想:无.#include#include#includeusing namespace std;int f[2002];int max(int x,int y){ if(x<y) x=y; return x;}in原创 2016-05-29 10:41:58 · 201 阅读 · 0 评论 -
练习三 1016
概述:在一无限大的二维平面中,我们做如下假设:1、;每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)思路:假设目的为向上走,第一步有三种走法,第二步有七种走法,如果最后一步向右走,那么只能是上一步向左走的原创 2016-05-29 10:38:21 · 260 阅读 · 0 评论 -
练习三 1002
概述:求最大相同子序列长度问题。思路:动态规划,状态转移方程:a[i]==b[j]?dp[i-1][j-1]+1,max(dp[i-1][j],dp[i][j-1])。感想:一开始一直没想到应该是max(dp[i-1][j],dp[i][j-1])。#include#include#includeusing namespace std;char s1[1000],s2[1000原创 2016-05-28 15:43:15 · 263 阅读 · 0 评论 -
练习三 1023
概述:Speakless没有多少钱,总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用a(万美元),并且Speakless估计了他得到这个学校offer的可能性b。不同学校之间是否得到offer不会互相影响。“I NEED A OFFER”,他大叫一声。帮帮这个可怜的人吧,帮助他计算一下,他可以收到至少一份offer的最大概率。思路:典型的原创 2016-05-28 15:28:31 · 259 阅读 · 0 评论 -
练习三 1015
概述:输入一个十进制数,输出它的二进制.思路:好吧..并没有用到动态规划,不过用到了位运算符感想:无#include using namespace std;int main(){ int a[12]; int base10; while(cin>>base10) { int dig=0; whil原创 2016-05-29 10:20:03 · 225 阅读 · 0 评论 -
练习三 1013
概述:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?思路:由题目描述知,每头小母牛从第四个年头开始每年年初也生一头小母牛,则总的牛数为上一年的加上新生的,状态转移方程:dp[i]=dp[i-1]+dp[i-3].感想:无.#include #include #include usin原创 2016-05-29 10:17:01 · 219 阅读 · 0 评论 -
练习三 1012
概述:在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.例如n=3时.思路:1*2的骨牌可以横着放或者竖着放,那么状态转移方程dp[i]=dp[i-1]+dp[i-2].感想:注意数据大小问题,有些需要定义long long.#includeusing namespace std;int main(){ int n;原创 2016-05-29 10:12:05 · 296 阅读 · 0 评论 -
练习三 1011
概述:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数思路:同简单dp,和上一题基本一致,需要注意的是,由于数据较大,要使用long long数据类型。感想:无。#include #include#includeusing namespace std;long long dp[51];int main(){原创 2016-05-28 16:41:10 · 304 阅读 · 0 评论 -
练习三 1001
概述:最大子段和问题,不过同时让输出最大子段的开始和末端位置。状态转移方程:d[i]=(d[i-1]+a[i]>a[i])?d[i-1]+a[i]:a[i];max = {d[i],1感想:基础动态规划#include using namespace std;int get(int data[] , int &l , int &r , int dl){ int max原创 2016-05-28 15:26:41 · 233 阅读 · 0 评论 -
练习三 1010
概述:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?思路:简单dp。感想:无。#include using namespace std;int main(){ int n,a,i; int dp[10000]; cin>>n; while(n--) { dp[1]=0; dp原创 2016-05-28 16:38:20 · 228 阅读 · 0 评论 -
练习三 1007
概述:天上掉馅饼,0~9十个位置,第一秒只能在4,5,6,下一秒智能移动到相邻的位置,问最多能接到几个饼。思路:改变问法的的数塔问题,与1006差不多。感想:做题要会追其本源。#include#includeusing namespace std;int maxi(int a,int b,int c){ int max1; max1=a>b?a:b; m原创 2016-05-28 16:36:18 · 235 阅读 · 0 评论 -
练习三 1006
概述:数塔问题,求所能走的数字的最大和。思路:上课讲过的问题,可以从上向下,也可以从下向上,我用的从上向下,状态转移方程:dp[i][j]=data[i][j]+max(dp[i-1][j],dp[i-1][j-1]);感想:无。#include #include #include using namespace std;int data[1005][1005];int dp原创 2016-05-28 16:07:18 · 229 阅读 · 0 评论 -
练习三 1005
概述:猴子要吃香蕉,它有很多木箱子,每个箱子有长宽高,且每种箱子没有个数限制,放在上面的箱子的长和宽要严格小于下面的箱子的长和宽。思路;首先需要排序,将箱子长宽按从大到小排列,假设dp[i]是将第i个箱子放在最上面所能到达最大高度,dp[i]=max(dp[i],dp[j]+q[i].h),还有,一个箱子可以分为6种,不过可按排序简化了三种。感想:自己一直没想出来,只好在网上看的别人的代码原创 2016-05-28 15:50:28 · 220 阅读 · 0 评论 -
练习三 1003
概述:最大升序子序列和问题思路:循环列举开端位置,判断是否a[i]>a[i-1],最终比出最大值。#include#include#includeusing namespace std;int a[1005],dp[1005];const int inf =999999999;int main(){ int n,num,i,j; while(~scanf("%原创 2016-05-28 15:49:18 · 324 阅读 · 0 评论 -
ACM课程总结
ACM这门课是在同学的聊天中了解的,当时感觉自己应该没什么问题,很有勇气的报了这门课,但随着学习的深入,突然发现不是这么一回事,发现这门课的难度对我来说史无前例,不管是高等数学,还是其他的一些科目,难度都远远不及,可是既然来了,就不能放弃,就这么一步一步的坚持了下来,到现在也是非常有收获,可能很多人会怀疑这门课的实用性,但我认为,它带给我们的思考的方式是无与伦比的,尽管只有这一学期的学习,但在费玉原创 2016-06-30 23:04:05 · 932 阅读 · 0 评论