leetcode(medium)_2 leetcode2题目描述解答题目描述两个链表每个节点的数相加 得到新的链表解答逐位相加(注意最后一位如果有进位也要考虑)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x),...
leetcode(easy)_1 leetcode1题目描述解答1.暴力2.哈希表3.排序题目描述求数组内哪两个位置的数加起来等于给定和。解答1.暴力双重循环遍历整个数组2.哈希表用哈希表将原来数组保存,然后再遍历数组,查找target-当前数的值是否在哈希表中。class Solution {public: vector<int> twoSum(vector<int>& ...
422D 题意:f(i)表示有i个女孩比赛,若不分组,则应当比 次。但可以将他们分为x个组,每组i/x个人,每组分别进行比赛决出一个女孩,再将各个组决出的女孩进行比赛。给出t,l,r,求 t0·f(l) + t1·f(l + 1) + ... + tr - l·f(r). 解答:如果是素数,则无法分组,否则分为i/i的最小质因子组。i的最小质因子可通过筛素数的方法得出。#include#inclu
424C 题意:一个比赛中,有n次打分,有一个初始分数,这个初始分数加上这n次的分可得出n个结果,而作者只记得其中k次的结果,且不确定是哪几次的。问初始分数有多少中可能?解答:首先要初始化这n次的打分的前缀和。注意前缀和地去重处理!v将这k个结果分别枚举为第一次到第n次的结果,分别计算出初始值。如果这个得出某个初始值得次数恰好为k,那么这个初始值即为可能的结果。#include#include#
423D 题意:给出n个点,其中k个点只能有一条边相连,剩下的边至少有2条边相连,问构造出的树最远的两个点最近是多少解答:度为1的点的数目越多,这个距离就越小。那么构造一个中心点,发散地连k个点。不够n的一层一层往最外面的点上面添加即可。#include#include#includeusing namespace std;int main(){ int n,k; whil
423C 题意:告诉你一些字符串的信息,要求你重组并输出字典序最小的这个字符串,告诉你的信息是,某个子串在某几个位置出现,保证给的信息不冲突 解答:暴力!但是!要注意重复地位置要跳过,不然会超时!#include#include#include#include#include#includeconst int MAXN = 2000100;char s[MAXN];int ss[
822C 题意:给出n个区间和X,每个区间有左右边界和价值,li,ri,x。然后问从这n个区间找出2个不重合的区间,他们的区间长度和为x,并且价值最小。解答:方法一:预处理:记录所有以某个点为左端点、右端点的区间长度和价值。枚举以每个点为左端点和右端点的所有区间。记录每个以该点为右端点的区间的价值的最小值。然后从第二个点为起点更新最小值。#include#include#include#inc
floodfill 题意:有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?解答:floodfill.每次dfs可以连通的块。主函数里迭代循环,每找到一个未访问的点,便开始dfs,穷尽所有可以到达的点。#include#include#include#includeusing namespace std;const int MAXN = 150;
部分和问题 题意:给定整数a1,a2,a3...an,判断是否可以从中选出若干数,使它们的和恰好为k.解答:dfs注意:只要存在一种方案,就是true!#include#include#includeusing namespace std;const int MAXN = 110;int n,a[MAXN],k;bool dfs(int step,int t){ if(ste
邮局问题 题意:有横向排列的P个村庄,每个村庄都有一个坐标位置。在这P个村庄上要建V个邮局。问这P个村庄中建造V个邮局之后,所有村庄到最近的邮局的距离的最小值是多少?解答:dp[i][j]表示前i个村庄建造j个邮局的最小距离之和。 dp[i][j] = min(dp[i][j],dp[k][j-1] + w[k+1][j]) w[k+1][j]表示从第k+1个村庄到第j个村庄建立一个邮局的最
矩阵链乘的变换 题意:一串数,每次取掉一个数并且将这个数与周围两个数相乘的结果加起来,最后取得就剩两个数。求最小的答案。解答:区间dp。在网上看到两个答案:第一种思路:dp[i][j]表示从i-1到j最终取得就剩下i-1和j所得的最小值。那么状态转移方程为dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+a[k]*a[i-1]*a[j])(i 代码:#incl
括号匹配问题 题目:poj2955题意:给出一个只包含(、)、【、】的字符串,求出最长的合格子串的长度解答:dp[i][j]表示从第i个字符到第j个字符最长的合格子串的长度,由此得出两个转移方程: dp[i][j] = dp[i+1][j-1] + 2(i和j匹配) dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j])(i #include#in
石子合并问题 题目:NYOJ737题意:有n堆石子,每堆有a[i]个,每次合并时只能合并相邻的两堆,代价为两堆石子的个数之和。问把这n堆石子合并成一堆需要的最小代价是多少。解答:状态:dp[i][j] 表示合并第 i 堆到第 j 堆石子的最小代价转移方程:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1])
关于一些数的划分问题 问题一:将n划分为若干正整数之和,有多少种划分方法?(hdu1028)思路一:相当于1-n的完全背包,总重量为n,有多少种组合?思路二:dp[i][j]表示将i分为最多j组的划分方法数 转移方程为:dp[i][j] = dp[i][j-1] + dp[i-j][j] (i dp[i[j] = dp[i][j-1] + 1(i = j)
【转】isim使用技巧 Isim你不得不知道的技巧(整理)来源:电子产品世界; 注:本文由本人多出整理所得,原文章图片不清晰,自己整理配图后重新发表 安装好ISE,系统已经自带了ISim仿真软件,相比于专业的仿真软件Modelsim,ISim是免费的,不用编译库,小型设计仿真速度较快,对于轻量级的设计应该是完全足够的。Modelsim作为专业的仿真软件,具备了ISim的所有功能,同时
最长上升子序列的变化 题目:hdu1160题意:一群老鼠,每个老鼠有两个参数:重量和速度。寻找重量递增且速度递减的最长的子序列,输出该序列的坐标顺序。解答:先排序,然后最长上升子序列。注意:排序后坐标会改变,因此,应当在结构体中引入一个新的变量index,保存它的原始位置。保存路径:记录比当前位置小的上一个位置的左边即可。#include#include#include#includeusing n
入门级dp2 题目:hdu1158题意:输入num个月,输入每个月雇佣员工、员工薪资、解雇员工所用的钱。输入每个月至少需要多少个员工(num个数)。解答:dp.注意初始状况:第一个月要分开讨论。注意每一段的取值范围。#include#include#include#includeusing namespace std;const int MAXN = 100 + 10;const int
最大连续子序列和 直接贴代码!int cal(int *q,int len){ int sum = 0; int Max = 0; for(int i = 0;i < len;i++) { sum += q[i]; if(sum < 0) sum = 0; if(sum > Max)
简单记忆化搜索 题目:hdu1078题意:给你一个n*n的地图,从左上角那个点出发,每次从左上角出发,最多走k步,而且每次走到的点必须比上一步的数大,求最大的和。解答:dp[x][y]表示从坐标为(x,y)的地方出发,最多达到的值。每次记录每种走法中的最大值。#include#include#include#include#includeint n,k;using namespace st
stl中的upper_bound和lower_bound lower_bound:返回最小的大于等于key的位置upper_bound:返回最大的小于等于key的位置头文件:algorithm注意:当使用lower_bound时key的值大于最大的值,查找到的位置是越界的(最大下标+1) 而当使用upper_bound的key的值小于最小的值,查找到的位置是第一个下标格式:假设数组为a,长度为n,pos = lower_boun