UVa 111: History Grading

2024-06-07 06:48
文章标签 111 history uva grading

本文主要是介绍UVa 111: History Grading,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题首先要对输入进行处理,解题的一般思路是将所给的c数组与r数组按照各个历史事件的rank重排,即最早的事件的编号放在数组的第一位......然后这题转化为求两个串的最长公共子序列长度的问题。

但我使用了另外一种解法(虽然仍然要用动态规划 =-= ):

只对输入的c数组重排(即c数组中c[i]存放rank为i的事件的编号),r数组不变。建立ans数组,ans[i]存放以rank为i为结尾的最长序列长度,初始化均为1。

程序从第0个开始填充ans数组。当执行到求ans[i]时,分别判断rank从0 — i-1 的事件,如j事件,在学生的解答(即r数组中数据)中发生时间是否也在i事件之前,如果在其之前,则用ans[j]+1更新ans[i](因为ans[i]初始化为1)。ans数组填充完毕后,其中最大值即为所求结果。

我的代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;int c[20],r[20];
int ans[20];
int N;
int main()
{cin >> N;int ci;for(int i=0; i<N; i++){//按时间顺序重排c数组cin >> ci;c[ci-1]=i;}int tmp;while(cin >> tmp){r[0]=tmp;ans[tmp]=0;for(int i=1; i<N; i++)cin >> r[i];int maxlen=1;ans[0]=1;		for(int i=1; i<N; i++){ans[i]=1;//依次判断事件0~i-1for(int j=0; j<i; j++){if(r[c[j]] < r[c[i]]) { if(ans[i]<(ans[j]+1)) ans[i]=ans[j]+1; }}if(maxlen<ans[i]) maxlen=ans[i];}cout << maxlen << endl;}return 0;
}



这篇关于UVa 111: History Grading的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038444

相关文章

项目总结-前端路由hash和history

项目总结-前端路由hash和history router模块 路由需要实现的功能 当浏览器地址发生变化的时候,切换页面点击浏览器后退前进的时候,网页内容发生变化刷新浏览器,网页加载当前路由对应内容 路由主要是通过监听事件,并利用js实现动态改变网页内容,有两种实现方式 hash模式:监听浏览器地址hash地址的变化,执行相应的js切换网页history模式:利用history API实现

UVA - 12206 Stammering Aliens (hash)

这题其实很容易想到2分长度,关键是2分后,怎么判断出现最多次的串是否》=m次了。这里需要用到hash来处理。 对于一个字符串   H[i] =H[i+1]*131+s[i]  ;其中 H[n]=0;那么对于一个长度为L的串 ,hanh[i,l]=H[i]-H[i+L]*x^L ; 这样记录每个字符串的hash值,然后再处理起来就比较简单了。 VIEW CODE #include<

[Uva 11990] Dynamic Inversion (CDQ分治入门)

Uva - 11990 动态逆序对,求删除一个点之前序列中逆序对的个数 首先倒过来看这个问题,把点先全部删掉 然后从最后一个点开始倒着往数列中加点 求加完这个点逆序对的变化 CDQ分治做法 把删除时间看作 t,下标看作 x,值看作 y 然后对 x排序,对 t偏序,用树状数组维护 y 具体来说就是对于每个点 (t0,x0,y0) (t_0, x_0, y_0) 先统计

【学一点儿前端】单页面点击前进或后退按钮导致的内存泄露问题(history.listen监听器清除)

今天测试分配了一个比较奇怪的问题,在单页面应用中,反复点击“上一步”和“下一步”按钮时,界面表现出逐渐变得卡顿。为分析这一问题,我用Chrome的性能监控工具进行了浏览器性能录制。结果显示,每次点击“上一步”按钮时,JavaScript堆内存(JS Heap)和事件监听器(listener)的数量显著增加,并且随着点击次数的增加,这种增长趋势变得越来越明显,所需的时间也逐渐延长。如图所示: 于是

Reinforced History Backtracking for Conversational Question Answering论文翻译

公众号 系统之神与我同在 链接如下: http://link.zhihu.com/?target=https%3A//www.aaai.org/AAAI21Papers/AAAI-1260.QiuM.pdf 对话问答的强化历史追溯 摘要 在多轮对话中对上下文历史建模已成为更好地理解问答系统中的用户查询的关键步骤。为了利用语境历史,大多数现有的研究将整个语境视为输入,这将不可避免地面临以下两

代码随想录训练营第十四天 226翻转二叉树 101对称二叉树 104二叉树的最大深度 111二叉树的最小深度

第一题: 原题链接:226. 翻转二叉树 - 力扣(LeetCode) 思路: 递归法:使用中序遍历的操作,中左右,在遍历到中间节点的时候对它左右节点进行交换。 代码如下: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode

UVA 11624 搜索

给出1000*1000矩阵,含起点‘J’,路‘.',墙‘#’,火‘F'; 火每秒蔓延一格,人每秒走一步 问人是否可以安全走出矩阵,不能被火碰到 先对所有火BFS一遍,记录每个点被烧到的时间 然后对人BFS一遍,若到每点前没被火烧即可走 #include "stdio.h"#include "string.h"#include "queue"using namespace

leetcode-12-[226]翻转二叉树[101]对称二叉树[104]二叉树的最大深度[111]二叉树的最小深度

前置知识: 深度:任意节点到根节点的节点数 高度:任意节点到叶子节点(左右孩子都为空)的节点数 一、[226]翻转二叉树 重点:交换节点应该传入根节点 class Solution {public TreeNode invertTree(TreeNode root) {if(root==null)return root;//前序遍历swap(root);invertTree(root.l

Studying-代码随想录训练营day14| 226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

第十四天,(ง •_•)ง💪💪,编程语言:C++ 目录 226.翻转二叉树 101.对称二叉树 100.相同的树  572.另一个树的子树 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 总结 226.翻转二叉树 文档讲解:代码随想录翻转二叉树 视频讲解:手撕翻转二叉树 题目: 初看:本题翻转二叉树不仅仅是把根节点的左右子树

UVa 11361 Investigating Div-Sum Property

这道题居然提交了十次才过....期间小问题不断。思路的话基本是《训练指南》里面来的,不过有几个小问题需要注意一下。第一,当K在大于100的情况下,就直接输出0就可以了。因为a,b不超过2^31,可以估算出a,b最多十位十进制数,那么每位最大为9,所以各个数字之和是不可能超过100的,那么个数字之和为模K为0的条件是永远不可能到达的。       还有一点是,当剩余数字d=0时,当且