延吉最好的网站建设公司网络推广网站建设
web/
2025/10/3 7:10:03/
文章来源:
延吉最好的网站建设公司,网络推广网站建设,国内响应式网站建设,专业的家居行业网站制作7-1 数塔
数塔如图所示#xff0c;若每一步只能走到相邻的结点#xff08;图中有数字的方格#xff09;#xff0c;则从最顶层走到最底层所经过的所有结点的数字之和最大是多少#xff1f;测试数据保证结果不大于231−1。 C
#include bits/stdc.h
using namespa…7-1 数塔
数塔如图所示若每一步只能走到相邻的结点图中有数字的方格则从最顶层走到最底层所经过的所有结点的数字之和最大是多少测试数据保证结果不大于231−1。 C
#include bits/stdc.h
using namespace std;int main(){int n;cinn;while(n--){int a[101][101]{0};int dp[101][101]{0};int high;//最高层号cinhigh;for(int i1;ihigh;i){for(int j1;ji;j){cina[i][j];if(ihigh){dp[i][j]a[i][j];//递推边界}}}for(int ihigh-1;i1;i--){for(int j1;ji;j){dp[i][j]max(dp[i1][j],dp[i1][j1])a[i][j];}}coutdp[1][1]endl;}
}7-2 最大子列和问题
给定K个整数组成的序列{ N1, N2, ..., NK }“连续子列”被定义为{ Ni, Ni1, ..., Nj }其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 }其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序计算给定整数序列的最大子列和。
本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下
数据1与样例等价测试基本正确性数据2102个随机整数数据3103个随机整数数据4104个随机整数数据5105个随机整数
输入格式:
#includeiostream
using namespace std;int main() {int K, sum 0;int number[100000];cin K;for (int i 0; i K; i) {cin number[i];}for (int i 0; i K; i) {int temp 0;for (int j i; j K; j) {temp number[j];if (temp sum) {sum temp;}}}cout sum;return 0;
}
7-3 最长公共子序列
给定两个长度分别为 N 和 M 的字符串 A 和 B求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。
#include iostream
using namespace std;
const int N 1010;
int n, m;
char a[N], b[N];
int f[N][N];
int main() {cin n m a 1 b 1;for (int i 1; i n; i) {for (int j 1; j m; j) {if (a[i] b[j]) {//找到一个公共字符故长度加1f[i][j] f[i - 1][j - 1] 1;} else {//没找到则找到临近最大的一个长度表示最大长度还没有变化//【为什么只需要找临近呢因为dp数组中抽象地保存之前的状态所以已经包含前面比较短的情况再者因为保存之前的状态现在遍历到的这个位置临近的元素就是之前状态的长度因为我现在需要长度不变所以在临近找一个最大的即可。】f[i][j] max(f[i - 1][j], f[i][j - 1]);}}}cout f[n][m] \n;return 0;
}
7-4 jmu-ds-最长公共子串
给出2个字符串输出2字符串的最长公共子串。
输入格式:
输入2个字符串不可包含空格。
输出格式:
输出2个字符串的最长公共子串。若没有公共子串则输出“NULL”
python
a input()
b input()
def maxSubstring(a,b):if aNone or bNone:#空值返回return None#接下来获取两者较长和较短的字符串if len(a)len(b):Mambelse:Mbma#遍历遍历较短的字符串并依次减少短字符串的字符数量#判断长字符是否包含该子串i0while ilen(m):begin0endlen(m)-i#先扣住end部分的字符然后一个循环看begin从0~end是否有符合的最大串while endlen(m):currentm[begin:end]if current in M:return currentbegin1end1i1return NULL
print(maxSubstring(a,b))7-5 最长有序子序列
对于给定一个数字序列 (a1a2…an) 如果满足a1a2…an则称该序列是有序的。若在序列(a1a2…an) 中删除若干元素得到的子序列是有序的则称该子序列为一个有序子序列。有序子序列中长度最大的即为最长有序子序列。
例如(135)、(358)、(1359)等都是序列 (1735948) 的有序子序列而(1359)、(1358)、(1348)都是序列 (1735948)的一个最长有序子序列长度为4。
请编写程序求出给定数字序列中的最长有序子序列的长度。
python
def longest_ordered_subsequence(nums):# 获取数字序列的长度n len(nums)# 创建一个数组来保存以每个元素结尾的最长有序子序列的长度dp [1] * n# 计算最长有序子序列的长度for i in range(1, n):for j in range(i):if nums[i] nums[j]:dp[i] max(dp[i], dp[j] 1)# 返回最长有序子序列的最大长度return max(dp)# 读取输入数据的数量
T int(input())for _ in range(T):# 读取数字序列的长度和元素n int(input())sequence list(map(int, input().split()))# 计算并输出最长有序子序列的长度result longest_ordered_subsequence(sequence)print(result)# 输出空行除了最后一组测试数据if _ ! T - 1:print()7-6 跳房子
跳房子是小朋友玩的游戏。地面上画出一连串格子每个格子里有一个整数小朋友从外面跳入格子并继续往前跳直到跳出所有格子。每次跳跃的规则是可以跳入下一格或下下格或下下下格。怎么跳能让落脚格子里的数的累加和最小。
python3
n int(input()) # 读入格子数
nums list(map(int, input().split())) # 读入每个格子里的数
numsnums[0]dp [100000] * (n 2) # 初始化dp数组
dp[0] 0
dp[1] nums[0]for i in range(2, n 2 ): dp[i] min(dp[i - 1] nums[i-1], dp[i - 2] nums[i-1], dp[i - 3] nums[i-1]) # 计算当前格子的最小累加和 print(dp[n1]) # 输出结果7-7 寻宝路线
在一个m行n列方格矩阵中每一个方格内摆放着价值不等的宝贝价值可正可负让小明感到好奇的是从左上角到达右下角的所有可能路线中能捡到宝贝的价值总和最大是多少而且这种达到最大值的路线 又有多少条【注意只能从一个格子向下或向右走到相邻格子并且走到的格子宝贝一定会被捡起。】
c
#include iostream
#include vectorusing namespace std;int main() {int m, n;cin m n;vectorvectorint grid(m, vectorint(n, 0));// 读取宝贝价值矩阵for (int i 0; i m; i) {for (int j 0; j n; j) {cin grid[i][j];}}// 创建动态规划所需的二维数组vectorvectorint dp(m, vectorint(n, 0));vectorvectorint ways(m, vectorint(n, 0));dp[0][0] grid[0][0];ways[0][0] 1;// 初始化第一列和第一行for (int i 1; i m; i) {dp[i][0] dp[i - 1][0] grid[i][0];ways[i][0] 1;}for (int j 1; j n; j) {dp[0][j] dp[0][j - 1] grid[0][j];ways[0][j] 1;}// 计算其余位置的最大值和路径数量for (int i 1; i m; i) {for (int j 1; j n; j) {if (dp[i - 1][j] dp[i][j - 1]) {dp[i][j] dp[i - 1][j] grid[i][j];ways[i][j] ways[i - 1][j];} else if (dp[i - 1][j] dp[i][j - 1]) {dp[i][j] dp[i][j - 1] grid[i][j];ways[i][j] ways[i][j - 1];} else {dp[i][j] dp[i - 1][j] grid[i][j];ways[i][j] ways[i - 1][j] ways[i][j - 1];}}}int max_value dp[m - 1][n - 1];int max_ways ways[m - 1][n - 1];cout max_value max_ways endl;return 0;
}7-8 硬币找零
用 n 种不同币值的硬币凑出 m 元最少需要多少硬币。
输入格式:
第一行输入需要凑的钱数 m 和硬币的种类 n 0m1000n10第二行输入 n 种硬币的具体币值假设硬币供应量无限多。
输出格式:
输出最少需要的硬币个数
输入样例:
在这里给出一组输入。例如
PYTHON3
def min_coins(coins, m):dp [float(inf)] * (m 1)dp[0] 0for i in range(1, m 1):for coin in coins:if i coin:dp[i] min(dp[i], dp[i - coin] 1)return dp[m] if dp[m] ! float(inf) else -1if __name__ __main__:m, n map(int, input().split())coins list(map(int, input().split()))result min_coins(coins, m)print(result)7-9 至多删三个字符
给定一个全部由小写英文字母组成的字符串允许你至多删掉其中 3 个字符结果可能有多少种不同的字符串
C
#include bits/stdc.h
#define int long long
using namespace std;
const int N 1e6 10;
int dp[N][4];signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);string s, stemp;cin stemp;s.assign(0);s.append(stemp);dp[0][0] 1;for (int i 1; i s.size(); i){for (int j 0; j 3; j){dp[i][j] dp[i - 1][j];if (j)dp[i][j] dp[i][j] dp[i - 1][j - 1];for (int k i - 1; k 1 i - k j; --k){if (s[k] s[i]){dp[i][j] dp[i][j] - dp[k - 1][j - (i - k)];break;}}}}int ans 0;for (int i 0; i 3; i){ans ans dp[s.size() - 1][i];}cout ans endl;return 0;
}7-10 拼题A打卡奖励
拼题 A 的教超搞打卡活动指定了 N 张打卡卷第 i 张打卡卷需要 mi 分钟做完完成后可获得 ci 枚奖励的金币。活动规定每张打卡卷最多只能做一次并且不允许提前交卷。活动总时长为 M 分钟。请你算出最多可以赢得多少枚金币
输入格式
输入首先在第一行中给出两个正整数 N≤103 和 M≤365×24×60分别对应打卡卷的数量和以“分钟”为单位的活动总时长不超过一年。随后一行给出 N 张打卡卷要花费的时间 mi≤600最后一行给出 N 张打卡卷对应的奖励金币数量 ci≤30。上述均为正整数一行内的数字以空格分隔。
C
#includebits/stdc.h
using namespace std;
const int N1004;
const int INF0x3f3f3f3f;
int n,m;
int w[N],v[N];
//int f[N][10000];
int dp[N][30005];//前i个物品中得到价值为j时候的最小花费 //ans为dp[n][j]m时最大的j
int mv0;int main()
{
// cout365*60*24;cinnm;for(int i1;in;i)cinw[i];for(int i1;in;i){cinv[i];mvv[i];}// 01背包写法空间不够而且也会超时因为“花费”这一维度规模比较大而递推时需要一一枚举
// for(int i1;in;i)
// for(int j0;jm;j)
// {
// if(jw[i])
// f[i][j]max(f[i-1][j],f[i-1][j-w[i]]v[i]);
// else f[i][j]f[i-1][j];
// }//下面是另一种思路第二维换成价值//初始化 for(int i0;in;i){for(int j0;jmv;j){dp[i][j]INF; }}dp[0][0]0;//递归过程分为取第i个和不取第i个for(int i1;in;i){for(int j0;jmv;j){if(jv[i])//注意边界dp[i][j]min(dp[i-1][j-v[i]]w[i],dp[i-1][j]);else dp[i][j]dp[i-1][j];}}//可以改进递推过程由于递归方程中两个来源都是上一个i的,去掉第一个维度,节省空间注意这时候j要从大到小迭代才能保证递推过程中的dp[j-v[i]]是来源于i-1而不是i
// for(int i1;in;i)
// {
// for(int jmv;j0;--j)
// {
// if(jv[i])
// dp[j]min(dp[j-v[i]]w[i],dp[j]);
// else
// dp[j]dp[j];
// }//取答案最小花费在给定的m内的最大价值for(int jmv;j0;j--){if(dp[n][j]m){coutj;break;}}// coutf[n][m];return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86086.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!