题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子: 3 1 2 4 4 3 6 7 9 16 最后得到16这样一个数字. 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1-N的一个排列.若答案有多种可能,则输出字典序最小的那一个. [color=red]管理员注:本题描述有误,这里字典序…
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子:     3   1   2   4       4   3   6         7   9          16 最后得到16这样一个数字. 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1-N的一个…
题目链接:https://www.luogu.org/problemnew/show/P1118 题意: 1~n的一个排列,相邻的两项加起来得到下一行. 现在给定最后一行的数字,问最初的1~n的排列是什么. 思路: next_permutation大法好.但是要注意剪枝. 首先要发现最后一行这个数系数的规律是一个杨辉三角. 先处理出这个系数. 然后排列. 如果我们在加到前i项的时候发现他已经比结果大了,那么后面不管怎么排列都是没有用的,要跳过. 怎么跳过呢,这里还挺tricky的[要学会!] 用…
https://www.luogu.org/problemnew/show/P1118 next_permutation的第二个参数是最后一个元素的下一个元素,sort也是一样!有毒!这么低级的错误.而且应该是用do_while因为原始排列也要考虑! 使用sort跳过一些permutation的原理来源于: 1.假设解存在,那么对称位置的两个元素交换也是一种解 2.我们要求第一种解,必定是左边元素小于右边对应元素的 3.当某个排列导致当前大于sum,怎么证明发现该元素之后的任意排列都是大于sum…
题目 这个题我们乍一看会有些熟悉.觉得是可以用DP来做的那个题.但是打眼一看,就会发现不对了.因为那个题是顺推而这个题则是逆推. 这样的话可怎么办呢. 我们可以在草稿纸上推一下,我们随便写个数n. 再标个a,b,c,d. 当n=4时 我们可以得到下面的式子 sum=a+3b+3c+d a+2b+c         b+2c+d a+b          b+c         c+d a            b              c           d 因此我们就可以想到杨辉三角了…
P1132 数字生成游戏 题目描述 小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则: 将s的任意两位对换生成新的数字,例如143可以生成314,413,134: 将s的任意一位删除生成新的数字,例如143可以生成14,13,43 在s的相邻两位之间s[i],s[i + 1]之间插入一个数字x,x需要满足s[i] < x < s[i + 1].例如143可以生成1243,1343,但是不能生成1143,1543等. 现在小明想知道,在这个生成法则下,从s…
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单…
题目链接:https://www.luogu.org/problemnew/show/P1123 转载于:>>>>>> 题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少. 输入格式: 输入第1行有一个正整数T,表示了有T组数据. 对于每一组数据,第1行有两个正整数N和M,表示了数字矩阵为N行M列. 接下来N行,每行M个非负整…
题目:https://www.luogu.org/problemnew/show/P1216 题意: 给定一个三角形.从顶走到底,问路径上的数字之和最大是多少. 走的时候可以往左下(实际上纵坐标不变)或是往右下(纵坐标+1) 思路: 用$dp[i][j]$表示从$(1,1)$走到$(i,j)$的最大值. $(i,j)$可以从$(i-1,j)$或是$(i-1,j-1)$走过来 所以$dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + num[i][j]$ 初态为$…
题目 这道题是一个典型的DP,可以用倒推,顺推的方法,来解这道题.当然用不同的方法他的循环次序是不一样的,所以我们一定要深刻地理解题目的大意,再采用状态转移方程与边界每次求出最优解,并记录循环一遍后就可以得出答案. 顺推代码 #include<iostream> #include<cmath> #include<algorithm> #include<cstdio> using namespace std; int n,a[10000][10000],f[1…