- 博客(80)
- 收藏
- 关注
原创 leetcode(medium)_2
leetcode2题目描述解答题目描述两个链表每个节点的数相加 得到新的链表解答逐位相加(注意最后一位如果有进位也要考虑)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x),...
2019-08-24 23:46:45 143
原创 leetcode(easy)_1
leetcode1题目描述解答1.暴力2.哈希表3.排序题目描述求数组内哪两个位置的数加起来等于给定和。解答1.暴力双重循环遍历整个数组2.哈希表用哈希表将原来数组保存,然后再遍历数组,查找target-当前数的值是否在哈希表中。class Solution {public: vector<int> twoSum(vector<int>& ...
2019-08-22 10:38:38 151
原创 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
2017-07-25 13:14:43 472
原创 424C
题意:一个比赛中,有n次打分,有一个初始分数,这个初始分数加上这n次的分可得出n个结果,而作者只记得其中k次的结果,且不确定是哪几次的。问初始分数有多少中可能?解答:首先要初始化这n次的打分的前缀和。注意前缀和地去重处理!v将这k个结果分别枚举为第一次到第n次的结果,分别计算出初始值。如果这个得出某个初始值得次数恰好为k,那么这个初始值即为可能的结果。#include#include#
2017-07-23 23:46:58 515
原创 423D
题意:给出n个点,其中k个点只能有一条边相连,剩下的边至少有2条边相连,问构造出的树最远的两个点最近是多少解答:度为1的点的数目越多,这个距离就越小。那么构造一个中心点,发散地连k个点。不够n的一层一层往最外面的点上面添加即可。#include#include#includeusing namespace std;int main(){ int n,k; whil
2017-07-23 23:26:18 1100
原创 423C
题意:告诉你一些字符串的信息,要求你重组并输出字典序最小的这个字符串,告诉你的信息是,某个子串在某几个位置出现,保证给的信息不冲突 解答:暴力!但是!要注意重复地位置要跳过,不然会超时!#include#include#include#include#include#includeconst int MAXN = 2000100;char s[MAXN];int ss[
2017-07-23 22:59:58 604
原创 822C
题意:给出n个区间和X,每个区间有左右边界和价值,li,ri,x。然后问从这n个区间找出2个不重合的区间,他们的区间长度和为x,并且价值最小。解答:方法一:预处理:记录所有以某个点为左端点、右端点的区间长度和价值。枚举以每个点为左端点和右端点的所有区间。记录每个以该点为右端点的区间的价值的最小值。然后从第二个点为起点更新最小值。#include#include#include#inc
2017-07-23 22:46:36 498
原创 floodfill
题意:有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?解答:floodfill.每次dfs可以连通的块。主函数里迭代循环,每找到一个未访问的点,便开始dfs,穷尽所有可以到达的点。#include#include#include#includeusing namespace std;const int MAXN = 150;
2017-07-14 11:06:31 369
原创 部分和问题
题意:给定整数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
2017-07-14 10:59:38 320
原创 邮局问题
题意:有横向排列的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个村庄建立一个邮局的最
2017-07-13 10:57:48 799
原创 矩阵链乘的变换
题意:一串数,每次取掉一个数并且将这个数与周围两个数相乘的结果加起来,最后取得就剩两个数。求最小的答案。解答:区间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
2017-07-11 19:35:33 298
原创 括号匹配问题
题目: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
2017-07-06 16:33:35 229
原创 石子合并问题
题目: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])
2017-07-06 14:53:23 291
原创 关于一些数的划分问题
问题一:将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)
2017-07-05 21:32:41 392
原创 【转】isim使用技巧
Isim你不得不知道的技巧(整理)来源:电子产品世界; 注:本文由本人多出整理所得,原文章图片不清晰,自己整理配图后重新发表 安装好ISE,系统已经自带了ISim仿真软件,相比于专业的仿真软件Modelsim,ISim是免费的,不用编译库,小型设计仿真速度较快,对于轻量级的设计应该是完全足够的。Modelsim作为专业的仿真软件,具备了ISim的所有功能,同时
2017-03-23 12:03:18 1570
原创 最长上升子序列的变化
题目:hdu1160题意:一群老鼠,每个老鼠有两个参数:重量和速度。寻找重量递增且速度递减的最长的子序列,输出该序列的坐标顺序。解答:先排序,然后最长上升子序列。注意:排序后坐标会改变,因此,应当在结构体中引入一个新的变量index,保存它的原始位置。保存路径:记录比当前位置小的上一个位置的左边即可。#include#include#include#includeusing n
2017-03-22 00:51:57 337
原创 入门级dp2
题目:hdu1158题意:输入num个月,输入每个月雇佣员工、员工薪资、解雇员工所用的钱。输入每个月至少需要多少个员工(num个数)。解答:dp.注意初始状况:第一个月要分开讨论。注意每一段的取值范围。#include#include#include#includeusing namespace std;const int MAXN = 100 + 10;const int
2017-03-21 20:48:02 321
原创 最大连续子序列和
直接贴代码!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)
2017-03-04 22:42:54 218
原创 简单记忆化搜索
题目:hdu1078题意:给你一个n*n的地图,从左上角那个点出发,每次从左上角出发,最多走k步,而且每次走到的点必须比上一步的数大,求最大的和。解答:dp[x][y]表示从坐标为(x,y)的地方出发,最多达到的值。每次记录每种走法中的最大值。#include#include#include#include#includeint n,k;using namespace st
2017-03-02 22:45:36 449
原创 stl中的upper_bound和lower_bound
lower_bound:返回最小的大于等于key的位置upper_bound:返回最大的小于等于key的位置头文件:algorithm注意:当使用lower_bound时key的值大于最大的值,查找到的位置是越界的(最大下标+1) 而当使用upper_bound的key的值小于最小的值,查找到的位置是第一个下标格式:假设数组为a,长度为n,pos = lower_boun
2017-02-23 18:07:58 418
原创 最长上升子序列
最长上升子序列,众所周知,是dp的经典问题。用简单的dp解决的复杂度是O(n方),用dp+二分的方法解决的复杂度是O(nlogn).1、转移方程:MaxLen (1) = 1MaxLen (k) = Max { MaxLen (i):12、假定存在一个序列d[1...9]=2 1 5 3 6 4 8 9 7,可以看出LIS长度为5。现在开始一步一步的找出
2017-02-23 14:33:07 244
原创 几种情况的二分写法
之前总是对二分的边界问题把握的不是很好,以致于出现死循环等问题。所以用这篇博文进行总结。首先,本文所用算法均为左闭右闭的算法,且数组是以非递减顺序排列的。1、查找是否存在关键值,如有相等的,则返回最左边的那个值的位置。否则,返回-1.代码如下:int binary_search_1(int a[], int n, int key){ int m, l = 0, r =
2017-02-23 13:48:45 2481 1
原创 简单dp之——m段子序列的最大和
题目:hdu1024题意:m:分成m段。n:数组长度。给定一个数组求m段子区间的最大和解答:dp[i][j]:前j个数分成i组的最大子区间和。1、状态转移方程:dp[i][j] = max(dp[i][j-1] + a[j],max(dp[i-1][k](0 2、优化成一维的。(1)将i放入外层循环当中(2)如何求max(dp[i-1][k])?dp[i-1][k]相当
2017-01-12 21:46:49 1386
原创 普通01背包
题目:hdu1864题意:现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。解答:普通的01背包问题。需要注意的是输入!#include#include#include#
2016-12-03 01:09:31 333
原创 dp/单调栈
题目:hdu1506题意:一个柱形图,宽均为1.内部最大的矩形的面积。解答:刚开始想的是从某个区间内找小的高遍历所有区间找出最大的矩形。但是复杂度太高啦! 正确的解答:从每一条出发,分别求出这一条左边连续比它高的和右边连续比它高的坐标。然后遍历一遍便可以求出最大值。左右!!!可以分别从左边和右边遍历求!!!以左边为例:如果左边那个比它高,那么比它左边还高的一定比它
2016-12-02 13:45:46 467
原创 入门级dp
题目:hdu1260题意:每个人去买花,要么两个人一起买用一个时间,要么一个人一个人单独买,问总共的最少的时间解答:简单dp。状态转移方程dp[i+1] = min(dp[i]+a[i+1],dp[i-1]+b[i]);#include#include#includeusing namespace std;const int MAXN = 2010;int dp[2010];
2016-12-02 01:50:20 335
原创 初学数据库1
select * from movieswhere name between 'A' AND 'J';select * from movies where year between 1990 AND 2000;select * from movieswhere year between 1990 and 2000and genre = 'comedy';select * from
2016-11-30 00:49:29 305
原创 dp1.1
题目:cf363c题意:给你n天的情况 0 代表休息 1 代表只能参加contest或休息 2 代表只能参加gym或休息 3 代表能参加contest或gym或休息要求 不能连续参加contest 不能连续参加gym问 如何安排使得休息日最少 输出休息日的数量解答:d[i][j]表示第i天做什么。j=0:休息。j=1:gym。j=2:休息。#incl
2016-10-14 22:15:25 513
原创 二维费用的背包问题
题目:toj3596题意:有N张光盘,每张光盘有一个价钱,现在要从N张光盘中买M张,预算为L,每张光盘有一个快乐值,要求在不超过预算并且恰好买M张,使得快乐值最大。解答:典型的二维费用背包问题,另外一种隐含的费用为个数,每个物品的个数费用为1。要求恰好买M张表示要求恰好装满,所以初始化不是0,而是-INF。二维背包的状态转移方程:F[i, v, u] = max{F[i − 1, v,
2016-10-14 22:10:36 4575 1
原创 错排公式
题目:hdu1465题意:同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!问有几种装法。题解:错排公式。。f[n] = (n-1) * [f[n-1] + f[n-1]]#include#include#includeusing namespace std;const int MAXN = 25;long long in
2016-10-02 19:47:00 427
原创 母函数练习2
题目:hdu1171题意:有n个物品,每个物品有它的重量和它的数目。求怎么尽可能把它们分成两部分。解答:写出其母函数,然后模拟(也可以用完全背包)#include#include#include#include#includeusing namespace std;const int MAXN = 250005;int c1[MAXN],c2[MAXN];struct
2016-10-02 15:35:52 265
原创 母函数练习
题目:hdu1085题意:给出1元、2元和5元硬币的数量,问你用这些钱币第一个不能组成的钱数是多少解答:母函数模拟~~~#include#include#include#include#define mod 25000001using namespace std;const int MAXN = 8010;int c1[MAXN],c2[MAXN];int main()
2016-10-02 14:04:23 412
原创 有关一些正则表达式的元字符
一些元字符:\s:用于匹配单个空格符,包括tab键和换行符;\S:用于匹配除单个空格符之外的所有字符;\d:用于匹配从0到9的数字;\w:用于匹配字母,数字或下划线字符;\W:用于匹配所有与\w不匹配的字符;. :用于匹配除换行符之外的所有字符。(说明:我们可以把\s和\S以及\w和\W看作互为逆运算)\b:用于匹配单词的开始或者
2016-10-01 21:14:24 359
原创 母函数入门
题目:hdu1028题意:整数拆分(一个整数能有几种拆分方式)解答:其中一种方法是用母函数。对于这道题来说是(1+x+x^2+x^3+x^4...)(1+x^2+x^4+x^6+x^8+x^10+...)(1+x^3+x^6+x^9+...)(...)... (一直到n) 最后算出来了结果之后系数表示拆分的方法数,指数表示拆几先给代码:#include#include#in
2016-09-21 17:55:11 357
原创 多重背包基础
题目:hdu1171题意:把一个多重背包尽可能地分成相等的两份。解答:背包的总乘重为所有重量的一半,然后尽可能地接近这个总乘重就好。//多重背包#include#include#includeusing namespace std;const int MAXN = 300000;int dp[MAXN];int N,W;int value[55],num[55];vo
2016-09-21 16:13:04 392
原创 二维完全背包
题目:hdu2159题意:xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗。解答:把忍耐度看成容量,经验值看成是价值。由于限制了放入物品的个数,所以这是一个二维的完全背包问题。dp[j][w]表示用了j的忍耐值、杀了w个怪的
2016-09-18 11:01:31 2042
原创 01背包与完全背包结合
题目:hdu5410题意:一个物品重量W,告诉你总的物品时数和总钱数。买x个会给a*x+b个蜡烛。问最多可以获得多少个蜡烛。解答:如果每个物品只拿一个,那就给a+b个蜡烛,所以先01背包再完全背包。#include#include#include#include#includeusing namespace std;const int MAXN = 2020;struct
2016-09-15 21:03:39 355
原创 完全背包基础
题目:hdu1114题意:一个背包,求装满状态下能乘的最小价值解答:完全背包~~~//完全背包#include#include#include#include#includeusing namespace std;const int maxn = 550;const int MAXN = 10010;const int INF = 0x3f3f3f3f;struct
2016-09-15 10:50:08 296
原创 01背包变化4
题目:hdu5544题意:给一个长度为L的平台,和n根金条的长度与价值,金条只能在平台上摆一长条,且每根金条的重心不能超出平台边缘。解答:01背包dp加一维表示当前物品与之前物品已经占用了多少个边缘。dp[k][i][v]:第一维:k=0,1,2。0代表没有半截的情况,1代表有1个半截的情况,2代表有2个半截的情况。 第二维:前i物品。 第三位:占了v容量。
2016-09-04 17:17:00 293
原创 01背包变化3
题目:hdu2546题意:电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。解答:如果m#includ
2016-09-02 22:22:40 494
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人