动态规划题目和代码

合集下载

《信息学奥赛一本通》:第9章 第2节 动态规划背包问题(C++版)

《信息学奥赛一本通》:第9章  第2节 动态规划背包问题(C++版)
f[n][m]即为最优解。
【参考程序】
#include<cstdio> using namespace std;
const int maxm = 201, maxn = 31;
int m, n;
int w[maxn], c[maxn];
int f[maxn][maxm];
int main()
{
scanf("%d%d",&m, &n);
for (int i=1; i <= n; i++)
//设f(v)表示重量不超过v公斤的最大价值
for (int v = m; v >= w[i]; v--)
if (f[v-w[i]]+c[i]>f[v])
f[v] = f[v-w[i]]+c[i];
printf("%d",f[m]);
// f(m)为最优解
【例9-12】、完全背包问题 【问题描述】
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限 的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品 可以多次选取),使其重量的和小于等于M,而价值的和为最大。
【输入格式】
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。 【输出格式】
第九章 动态规划
第二节 背包问题
第二节 背包问题
一、01背包问题 问题:
有N件物品和一个容量为V的背包。第i件物品的费用(即体积,下同)是w[i], 价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量, 且价值总和最大。 基本思路:

动态规划试题

动态规划试题

动态规划试题动态规划装箱问题(01背包):有⼀个箱⼦容量为VV(正整数,0≤V≤20000),同时有n个物品(024 68 3 12 7 9 7输出:0f[j]=max(f[j],f[j-w[i]]+w[i]);f[j] 为:当总容量为j 时,不放第i 件物品,所能装的最⼤体积。

f[j-w[i]]+w[i] 为:当总容量为j 时,放了第i 件物品后,所能装的最⼤体积。

(即j减去第i 件物品体积的容量能装的最⼤体积+第i 件物品的体积。

w[i] 为第i 件物品体积)背包的种类:背包分为01背包,多重背包以及完全背包这三种基本模型,其他的背包问题都是从这3种背包中延申出来的。

完全背包的模板题⾯是这样的:设有n种物品,每种物品有⼀个重量及⼀个价值。

但每种物品的数量是⽆限的,同时有⼀个背包,最⼤载重量为M,今从n种物品中选取若⼲件(同⼀种物品可以⽆限选取),使其重量的和⼩于等于M,⽽价值的和为最⼤。

完全背包[⽆限量]的采摘药输⼊:70 371 10069 11 2输出:140每个数组在满⾜条件,可以遍历多次01背包实现代码:采药-传送门输⼊:70 371 10069 11 2输出:3每个数组遍历⼀遍题⽬描述⾦明今天很开⼼,家⾥购置的新房就要领钥匙了,新房⾥有⼀间他⾃⼰专⽤的很宽敞的房间。

更让他⾼兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就⾏”。

今天⼀早⾦明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。

于是,他把每件物品规定了⼀个重要度,分为5等:⽤整数1-5表⽰,第5等最重要。

他还从因特⽹上查到了每件物品的价格(都是整数元)。

他希望在不超过N元(可以等于N 元)的前提下,使每件物品的价格与重要度的乘积的总和最⼤。

设第jj件物品的价格为v_[j],重要度为w_[j],共选中了k件物品,编号依次为j_1,j_2,…,j_k,则所求的总和为:w_[j_k]v[j1]×w[j1]+v[j2]×w[j2]+…+v[jk]×w[jk]。

动态规划47题

动态规划47题

动态规划练习【题目一览】总分【问题描述】学生在我们USACO的竞赛中的得分越多我们越高兴。

我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。

我们可以从几个种类中选取竞赛的题目,这里的一个“种类”是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。

你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。

输入包括竞赛的时间M(1<=M<=10000)(不要担心,你要到了训练营中才会有长时间的比赛)和“种类”的数目N(1<=N<=10000)。

后面的每一行将包括两个整数来描述一个“种类”:第一个整数说明解决这种题目能得的分数(1<=points<=10000),第二整数说明解决这种题目所需的时间(1<=minutes<=10000)。

你的程序应该确定我们应该从每个“种类”中选多少道题目使得能在竞赛的时间中得到最大的分数。

来自任意的“种类”的题目数目可能任何非负数(0或更多)。

计算可能得到的最大分数。

【输入格式】输入文件中的第1行:M,N--竞赛的时间和题目“种类”的数目。

第2~N+1行:两个整数:每个“种类”题目的分数和耗时。

【输出格式】输出文件中仅一行,包括那个在给定的限制里可能得到的最大的分数。

【输入输出样例】输入:300 4100 60250 120120 10035 20输出:605从第2个“种类”中选两题第4个“种类”中选三题。

邮票【问题描述】已知一个N枚邮票的面值集合(如,{1分,3分})和一个上限K——表示信封上能够贴K张邮票。

计算从1到M的最大连续可贴出的邮资。

例如,假设有1分和3分的邮票;你最多可以贴5张邮票。

很容易贴出1到5分的邮资(用1分邮票贴就行了),接下来的邮资也不难:6 = 3 + 37 = 3 + 3 + 18 = 3 + 3 + 1 + 19 = 3 + 3 + 310 = 3 + 3 + 3 + 111 = 3 + 3 + 3 + 1 + 112 = 3 + 3 + 3 + 313 = 3 + 3 + 3 + 3 + 1然而,使用5枚1分或者3分的邮票根本不可能贴出14分的邮资。

DP入门(2)——DAG上的动态规划

DP入门(2)——DAG上的动态规划

DP⼊门(2)——DAG上的动态规划有向⽆环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础。

很多问题都可以转化为DAG上的最长路、最短路或路径计数问题。

⼀、DAG模型【嵌套矩形问题】问题:有n个矩形,每个矩形可以⽤两个整数a、b描述,表⽰它的长和宽。

矩形X(a , b)可以嵌套在矩形Y(c , d)中当且仅当a<c,b<d,或者b<c,a<d(相当于把矩形X旋转90°)。

例如(1,5)可以嵌套在(6, 2)内,但不能嵌套在(3, 4)内。

你的任务是选出尽可能多的矩形排成⼀⾏,使得除了最后⼀个之外,每个矩形都可以嵌套在下⼀个矩形内。

如果有多解,矩形编号的字典序应尽量⼩。

分析:矩形之间的“可嵌套”关系是⼀个典型的⼆元关系(我的理解是两个矩形之间存在关系),⼆元关系可以⽤图来建模。

如果矩形X可以嵌套在矩形Y⾥,就从X到Y连⼀条有向边。

这个有向图必然是⽆环的,因为⼀个矩形⽆法直接或间接地嵌套在⾃⼰内部。

换句话说,它是⼀个DAG。

这样,所要求的便是DAG上的最长路径。

【硬币问题】问题:有n种硬币,⾯值分别为V1, V2, ..., V n,每种都有⽆限多。

给定⾮负整数S,可以选⽤多少个硬币,使得⾯值之和恰好为S?输出硬币数⽬的最⼩值和最⼤值。

1 <= n <= 100, 0 <= S <= 10000, 1 <= V i <= S。

分析:此问题尽管看上去和嵌套矩形问题很不⼀样,但本题的本质也是DAG上的路径问题。

将每种⾯值看作⼀个点,表⽰“还需要凑⾜的⾯值”,则初始状态为S,⽬标状态为0。

若当前在状态 i,每使⽤⼀个硬币 j,状态便转移到i - V j。

补充:这个模型和上⼀题类似,但也有⼀些明显地不同之处:上题并没有确定路径的起点和终点(可以把任意矩形放在第⼀个和最后⼀个),⽽本题的起点必须为S,终点必须为0。

c++动态规划试题+分析

c++动态规划试题+分析

我们设机器人走到(i,j) 位置时拾到最多垃圾数为 f[i][j] ,由于机器人只能朝右和下走, 只 会跟机器人上一位置拾到最多的垃圾数有关,因此很容易写出状态转移方程。 F[i][j]=max{f[i-1][j],f[i][j-1]}+a[i][j],(1<=i<=n,1<=j<=m) 初始值:f[1][i]=f[1][i-1]+a[1][i] ,f[i][1]=f[i-1][1]+a[i][1] 时间复杂度为:O(nm) 我们再来看第二问: 在最优解的情况下求方案总数, 我们只要每次在最优解的情况下统 计路径条数即可,见图 2: 设 g[i][j] 表示在位置(i,j)达到拾到 f[i][j]垃圾时的路径总数,有如下ቤተ መጻሕፍቲ ባይዱ程: g[i][j]=g[i-1][j]*x+g[i][j-1]*y 当 f[i][j]=f[i-1][j]+a[i][j] 时,x=1,否则 x=0; 当 f[i][j]=f[i][j-1]+a[i][j] 时,y=1,否则 y=0;
using namespace std; int n,m,a[200005],b[200005],f[200005]; void init() { int i,j=0; cin>>n>>m; for(i=1;i<=n;i++)cin>>a[i]; for(i=1;i<m;i++)if(a[i]<a[m])b[++j]=a[i];//去掉前面大于等于 a[m]的数 b[++j]=a[m]; for(i=m+1;i<=n;i++)if(a[i]>a[m])b[++j]=a[i];//去掉后面小于等于 a[m]的数 } int ERLIS()//上升子序列 { int i,L,r,mid,len=1; f[1]=b[1]; for(i=2;i<=n;i++) { L=1;r=len; if(f[len]<b[i]){len++;f[len]=b[i];continue;} while(L<=r) { mid=(L+r)/2; if(f[mid]<b[i])L=mid+1;else r=mid-1; } f[L]=b[i]; } return len; } int main() { init(); cout<<ERLIS()<<endl; } 3、采药 .cpp/c/pas) (medic medic.cpp/c/pas) 【问题描述】 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最 有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都 是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间, 每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果 你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是辰辰,你能完成这个任务吗? 【输入格式】 输入文件的第一行包含两个正整数 N,M。M 表示总共能够用来采药的时间,N 代表山 洞里的草药的数目。 接下来的 N 行每行包括两个的整数,分别表示采摘某株草药的时间 T i 和这株草药的价 值 V i。 【输出格式】 输出文件仅包含一个整数表示规定时间内可以采到的草药的最大总价值。 【样例输入输出】 medic .in medic .out medic.in medic.out 39 3 10 10 81 12 】 【数据规模和约定 数据规模和约定】 50%的数据中 N ,M≤1000;

动态规划总结经典题目(经典中的经典)

动态规划总结经典题目(经典中的经典)

动态规划总结——经典问题总结本文着重讨论状态是如何表示,以及方程是怎样表示的。

当然,还附上关键的,有可能作为模板的代码段。

但有的代码的实现是优化版的。

经典问题总结最长上升子序列(LIS)问题描述如下:设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。

求最大的m值。

这里采用的是逆向思维的方法,从最后一个开始想起,即先从A[N](A数组是存放数据的数组,下同)开始,则只有长度为1的子序列,到A[N-1]时就有两种情况,如果a[n-1] < a[n] 则存在长度为2的不下降子序列a[n-1],a[n];如果a[n-1] > a[n] 则存在长度为1的不下降子序列a[n-1]或者a[n]。

有了以上的思想,DP方程就呼之欲出了(这里是顺序推的,不是逆序的):DP[I]=MAX(1,DP[J]+1)J=0,1,...,I-1但这样的想法实现起来是)O(n^2)的。

本题还有更好的解法,就是O(n*logn)。

利用了长升子序列的性质来优化,以下是优化版的代码://最长不降子序const int SIZE=500001;int data[SIZE];int dp[SIZE];//返回值是最长不降子序列的最大长度,复杂度O(N*logN)int LCS(int n) { //N是DATA数组的长度,下标从1开始int len(1),low,high,mid,i;dp[1]=data[1];for(i=1;i<=n;++i) {low=1;high=len;while( low<=high ) { //二分mid=(low+high)/2;if( data[i]>dp[mid] ) {low=mid+1;}else {high=mid-1;}}dp[low]=data[i];if( low>len ) {++len;}}return len;}最长公共子序列(LCS)给出两个字符串a, b,求它们的最长、连续的公共字串。

C语言动态规划之背包问题详解

C语言动态规划之背包问题详解

C语⾔动态规划之背包问题详解01背包问题给定n种物品,和⼀个容量为C的背包,物品i的重量是w[i],其价值为v[i]。

问如何选择装⼊背包的物品,使得装⼊背包中的总价值最⼤?(⾯对每个武平,只能有选择拿取或者不拿两种选择,不能选择装⼊某物品的⼀部分,也不能装⼊物品多次)声明⼀个数组f[n][c]的⼆维数组,f[i][j]表⽰在⾯对第i件物品,且背包容量为j时所能获得的最⼤价值。

根据题⽬要求进⾏打表查找相关的边界和规律根据打表列写相关的状态转移⽅程⽤程序实现状态转移⽅程真题演练:⼀个旅⾏者有⼀个最多能装M公⽄的背包,现在有n件物品,它们的重量分别是W1、W2、W3、W4、…、Wn。

它们的价值分别是C1、C3、C2、…、Cn,求旅⾏者能获得最⼤价值。

输⼊描述:第⼀⾏:两个整数,M(背包容量,M<= 200)和N(物品数量,N<=30);第2…N+1⾏:每⾏两个整数Wi,Ci,表⽰每个物品的质量与价值。

输出描述:仅⼀⾏,⼀个数,表⽰最⼤总价值样例:输⼊:10 42 13 34 57 9输出:12解题步骤定义⼀个数组dp[i][j]表⽰容量为j时,拿第i个物品时所能获取的最⼤价值。

按照题⽬要求进⾏打表,列出对应的dp表。

W[i](质量)V[i](价值)01234567891000000000000210011111111133001334444444500135568899790013556991012对于⼀个动态规划问题设置下标时最好从0开始,因为动态规划经常会和上⼀个状态有关系!从上⾯的dp表可以看出来对于⼀个物品我们拿还是不难需要进⾏两步来判断。

第⼀步:判断背包当前的容量j是否⼤于物品当前的质量,如果物品的质量⼤于背包的容量那么就舍弃。

第⼆步:如果背包可以装下这个物品,就需要判断装下该物品获取的最⼤价值是不是⼤于不装下这个物品所获取的最⼤价值,如果⼤于那么就把东西装下!根据这样的思想我们可以得到状态转移⽅程:如果单签背包的容量可以装下物品:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);如果当前背包的容量装不下该物品:dp[i][j]=dp[i-1][j];#include <stdio.h>int max(const int a,const int b){return a>b ? a:b;}int main(){int w[35]={0},v[35]={0},dp[35][210]={0};int n,m;scanf("%d %d",&m,&n);int i,j;for(i=1;i<=n;i++){scanf("%d %d",&w[i],&v[i]);}for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(j>=w[i])//如果当前背包的容量⼤于商品的质量{dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);//判断是否应该拿下}else//⼤于背包的当前容量{dp[i][j]=dp[i-1][j];}}}for(int k=0;k<=n;k++){for(int l=0;l<=m;l++){printf("%d ",dp[k][l]);}printf("\n");}printf("%d\n",dp[n][m]);}通过运⾏以上程序可以看到最终的输出dp表和我们的预期是相符合的!但是并没有结束,动态规划有⼀个后⽆效性原则(当前状态只与前⼀个状态有关)。

poj dp题目列表

poj dp题目列表

[1]POJ 动态规划题目列表容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈), 1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029, 2039, 2063, 2081, 2082, 2181, 2184, 2192, 2231, 2279, 2329, 2336, 2346, 2353, 2355, 2356, 2385, 2392, 2424,不易:1019, 1037, 1080, 1112, 1141, 1170, 1192, 1239, 1655, 1695, 1707, 1733(区间减法加并查集), 1737, 1837, 1850, 1920(加强版汉罗塔), 1934(全部最长公共子序列), 1937(计算几何), 1964(最大矩形面积,O(n)算法), 2138, 2151, 2161, 2178,推荐:1015, 1635, 1636(挺好的), 1671, 1682, 1692(优化), 1704, 1717, 1722, 1726, 1732, 1770, 1821, 1853, 1949, 2019, 2127, 2176, 2228, 2287, 2342, 2374, 2378, 2384, 24111015 Jury Compromise1029 False coin1036 Gangsters1037 A decorative fence1038 Bugs Integrated, Inc.1042 Gone Fishing1050 To the Max1062 昂贵的聘礼1074 Parallel Expectations1080 Human Gene Functions1088 滑雪1093 Formatting Text1112 Team Them Up!1141 Brackets Sequence1143 Number Game1157 LITTLE SHOP OF FLOWERS1159 Palindrome1160 Post Office1163 The Triangle1170 Shopping Offers1178 Camelot1179 Polygon1180 Batch Scheduling1185 炮兵阵地1187 陨石的秘密1189 钉子和小球1191 棋盘分割1192 最优连通子集1208 The Blocks Problem1239 Increasing Sequences1240 Pre-Post-erous!1276 Cash Machine1293 Duty Free Shop1322 Chocolate1323 Game Prediction1338 Ugly Numbers1390 Blocks1414 Life Line1432 Decoding Morse Sequences 1456 Supermarket1458 Common Subsequence1475 Pushing Boxes1485 Fast Food1505 Copying Books1513 Scheduling Lectures1579 Function Run Fun1609 Tiling Up Blocks1631 Bridging signals 2分+DP NLOGN 1633 Gladiators1635 Subway tree systems1636 Prison rearrangement1644 To Bet or Not To Bet1649 Market Place1651 Multiplication Puzzle1655 Balancing Act1661 Help Jimmy1664 放苹果1671 Rhyme Schemes1682 Clans on the Three Gorges 1690 (Your)((Term)((Project)))1691 Painting A Board1692 Crossed Matchings1695 Magazine Delivery1699 Best Sequence1704 Georgia and Bob1707 Sum of powers1712 Flying Stars1714 The Cave1717 Dominoes1718 River Crossing1722 SUBTRACT1726 Tango Tango Insurrection 1732 Phone numbers1733 Parity game1737 Connected Graph1740 A New Stone Game1742 Coins P1745 Divisibility1770 Special Experiment1771 Elevator Stopping Plan 1776 Task Sequences1821 Fence1837 Balance1848 Tree1850 Code1853 Cat1874 Trade on Verweggistan 1887 Testing the CATCHER 1889 Package Pricing1920 Towers of Hanoi1926 Pollution1934 Trip1936 All in All1937 Balanced Food1946 Cow Cycling1947 Rebuilding Roads1949 Chores1952 BUY LOW, BUY LOWER 1953 World Cup Noise1958 Strange Towers of Hanoi 1959 Darts1962 Corporative Network 1964 City Game1975 Median Weight Bead 1989 The Cow Lineup2018 Best Cow Fences2019 Cornfields2029 Get Many Persimmon Trees 2033 Alphacode2039 To and Fro2047 Concert Hall Scheduling 2063 Investment2081 Recaman's Sequence 2082 Terrible Sets2084 Game of Connections2127 Greatest Common Increasing Subsequence 2138 Travel Games2151 Check the difficulty of problems2152 Fire2161 Chandelier2176 Folding2178 Heroes Of Might And Magic2181 Jumping Cows2184 Cow Exhibition2192 Zipper2193 Lenny's Lucky Lotto Lists2228 Naptime2231 Moo Volume2279 Mr. Young's Picture Permutations2287 TianJi -- The Horse Racing2288 Islands and Bridges2292 Optimal Keypad2329 Nearest number - 22336 Ferry Loading II2342 Anniversary party2346 Lucky tickets2353 Ministry2355 Railway tickets2356 Find a multiple2374 Fence Obstacle Course2378 Tree Cutting2384 Harder Sokoban Problem2385 Apple Catching2386 Lake Counting2392 Space Elevator2397 Spiderman2411 Mondriaan's Dream2414 Phylogenetic Trees Inherited2424 Flo's Restaurant2430 Lazy Cows2915 Zuma3017 Cut the Sequence3028 Shoot-out3124 The Bookcase3133 Manhattan Wiring3345 Bribing FIPA3375 Network Connection3420 Quad Tiling ?/?cat=5[2]动态规划方法总结1. 按状态类型分写在前面:从状态类型分,并不表示一题只从属于一类。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划题目及其代码By LYLtim1、数塔问题(tower.pas)设有一个三角形的数塔,如下图所示。

顶点结点称为根结点,每个结点有一个整数数值。

从顶点出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。

【样例输入】tower.in5 {数塔层数}1311 812 7 266 14 15 812 7 13 24 11【样例输出】tower.outmax=86【参考程序】uses math;var n,i,j:byte;a:array[1..10,1..10]of word;f:array[1..10,1..10]of word;beginassign(input,'tower.in');reset(input);assign(output,'tower.out');rewrite(output);readln(n);for i:=1 to n dobeginfor j:=1 to i doread(a[i,j]);readln;end;fillchar(f,sizeof(f),0);for i:=1 to n do f[n,i]:=a[n,i];for i:=n-1 downto 1 dofor j:=1 to i dof[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[i,j];writeln('max=',f[1,1]);close(input);close(output);end.2、拦截导弹(missile.pas)某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

某天,雷达捕捉到敌国的导弹来袭。

由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

【样例输入】missile.in389 207 155 300 299 170 158 65【输出样例】missile.out6(最多能拦截的导弹数)2(要拦截所有导弹最少要配备的系统数)【参考程序】type node=recordh,lens:word;end;var n,i,j,maxl,num,minsys:word;mis:array[word]of node;sysl:array[word]of word;beginassign(input,'missile.in');reset(input);assign(output,'missile.out');rewrite(output);while not eoln dobegininc(n);read(mis[n].h);mis[n].lens:=1;end;for i:=2 to n dobeginfor j:=1 to i-1 doif(mis[j].h>mis[i].h)and(mis[j].lens+1>mis[i].lens)then mis[i].lens:=mis[j].lens+1;if mis[i].lens>maxlthen maxl:=mis[i].lens;end;writeln(maxl);num:=1;sysl[0]:=maxint;sysl[1]:=mis[1].h;for i:=2 to n dobeginminsys:=0;for j:=1 to num doif(sysl[j]>=mis[i].h)and(sysl[j]<sysl[minsys])then minsys:=j;if minsys=0 thenbegin inc(num); sysl[num]:=mis[i].h; endelse sysl[minsys]:=mis[i].h;end;writeln(num);close(input);close(output);end.3、最短路径(short.pas)在下图中找出从起点到终点的最短路径。

【样例输入】short.in70 3 5 0 0 0 00 0 0 7 8 6 00 0 0 0 4 5 00 0 0 0 0 0 40 0 0 0 0 0 70 0 0 0 0 0 60 0 0 0 0 0 0【样例输出】short.outminlong=141 2 4 7【参考程序】type node=recorddis,pre:word;end;var n,i,j,x:byte;map:array[byte,byte]of word;a:array[word]of node;beginassign(input,'short.in');reset(input);assign(output,'short.out');rewrite(output);readln(n);for i:=1 to n dobegina[i].dis:=maxint;for j:=1 to n do read(map[i,j]);end;close(input);a[n].dis:=0;for i:=n-1 downto 1 dofor j:=n downto i+1 doif(map[i,j]>0)and(a[j].dis<maxint)and(a[j].dis+map[i,j]<a[i].dis)then while a[i] do begin dis:=a[j].dis+map[i,j]; pre:=j; end;writeln('dis=',a[1].dis);x:=1;while a[x].pre<>0 dobeginwrite(x,' ');x:=a[x].pre;end;writeln(x);close(output);end.4、挖地雷(Mine.pas)在一个地图上有N个地窖(N<=200),每个地窖中埋有一定数量的地雷。

同时,给出地窖之间的连接路径,并规定路径都是单向的。

某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。

设计一个挖地雷的方案,使他能挖到最多的地雷。

【输入格式】N {地窖的个数}W1,W2,……WN{每个地窖中的地雷数} X1,Y1 {表示从X1可到Y1}X2,Y2……0 ,0 {表示输入结束}【输出格式】K1——K2——……——Kv {挖地雷的顺序} MAX {最多挖出的地雷数} 【输入样例】Mine.in65 10 20 5 4 51 21 42 43 44 54 65 60 0【输出样例】Mine.out3-4-5-634【参考程序】var n,start:byte;w:array[1..200]of word;g:array[1..200,1..200]of boolean;f:array[1..200]of longword;next:array[1..200]of byte;max:longword;procedure init;var i,x,y:byte;beginassign(input,'mine.in');reset(input);readln(n);for i:=1 to n do read(w[i]);readln;readln(x,y);fillchar(g,sizeof(g),false);while(x<>0)and(y<>0)dobeging[x,y]:=true;readln(x,y);end;close(input);end;{init}procedure work;var i,j:byte;beginfillchar(f,sizeof(f),0);f[n]:=w[n];fillchar(next,sizeof(next),0);for i:=n-1 downto 1 dobeginfor j:=i+1 to n doif(g[i,j])and(f[j]>f[i])thenbeginf[i]:=f[j];next[i]:=j;end;inc(f[i],w[i]);end;max:=0;for i:=1 to n doif f[i]>max thenbeginmax:=f[i];start:=i;end;end;{work}procedure print;beginassign(output,'mine.out');rewrite(output);write(start);while next[start]<>0 dobeginwrite('-',next[start]);start:=next[start];end;writeln;writeln(max);close(output);end;{print}begin{main}init;print;end.5、轮船问题(ship.pas)【问题描述】某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市。

每一对友好城市都希望有一条航线来往,于是他们向政府提出了申请。

由于河终年有雾。

政府决定允许开通的航线就互不交叉(如果两条航线交叉,将有很大机会撞船)。

兴建哪些航线以使在安全条件下有最多航线可以被开通。

【输入格式】输入文件(ship.in):包括了若干组数据,每组数据格式如下:第一行两个由空格分隔的整数x,y,10〈=x〈=6000,10〈=y〈=100。

x 表示河的长度而y表示宽。

第二行是一个整数N(1<=N<=5000),表示分布在河两岸的城市对数。

接下来的N行每行有两个由空格分隔的正数C,D(C、D〈=x〉,描述每一对友好城市与河起点的距离,C表示北岸城市的距离而D表示南岸城市的距离。

在河的同一边,任何两个城市的位置都是不同的。

【输出格式】输出文件(ship.out):要在连续的若干行里给出每一组数据在安全条件下能够开通的最大航线数目。

【输入输出样例】30 454 52 45 21 33 1Ship.out3【参考程序】type node=record c,d,l:word; end; var x,n:word;y:longword;a:array[1..5000]of node;maxl:word;procedure init;var i:word;beginassign(input,'ship.in');reset(input);readln(x,y);readln(n);for i:=1 to n dowith a[i] dobeginreadln(c,d);l:=1;end;close(input);end;{init}procedure qsort(l,r:word);var pl,pr,m:word;t:node;beginpl:=l;pr:=r;m:=a[(l+r)>>1].c;repeatwhile a[pl].c<m do inc(pl);while a[pr].c>m do dec(pr);if pl<=pr thenbegint:=a[pl];a[pl]:=a[pr];a[pr]:=t;inc(pl);dec(pr);end;until pl>pr;if pl<r then qsort(pl,r);if pr>l then qsort(l,pr);end;{qsort}procedure work;var i,j:word;beginfor i:=2 to n dobeginfor j:=1 to i-1 doif(a[j].d<a[i].d)and(a[j].l+1>a[i].l)then a[i].l:=a[j].l+1;if a[i].l>maxl then maxl:=a[i].l;end;end;{work}procedure print;beginassign(output,'ship.out');rewrite(output);writeln(maxl);close(output);end;{print}begin{main}init;qsort(1,n);work;print;end.7、砝码称重(weight.pas)设有1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重≤1000g),要求:【输入格式】a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,....20g砝码有a6个)【输出格式】Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)【输入样例】weight.in1 1 0 0 0 0【输出样例】weight.outTotal=3,表示可以称出1g,2g,3g三种不同的重量【参考程序】const wt:array[1..6]of shortint=(1,2,3,5,10,20); var n:array[1..6]of word;vis:array[0..1000]of boolean;w:array[0..1000]of word;i,j,k,nw:word;beginassign(input,'weight.in');reset(input);assign(output,'weight.out');rewrite(output);fillchar(vis,sizeof(vis),false);for i:=1 to 6 do read(n[i]);w[0]:=1;w[1]:=0;for i:=1 to 6 dofor j:=1 to w[0] dofor k:=1 to n[i] dobeginnw:=w[j]+wt[i]*k;if not vis[nw] thenbeginvis[nw]:=true;inc(w[0]);w[w[0]]:=nw;end;end;writeln('Total=',w[0]-1);close(input);close(output);end.8、装箱问题(boxes.pas)有一个箱子容量为v(正整数,0≤v≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。

相关文档
最新文档