Beginners Dynamic Programming Registration and Record - trying to understand

Beginning of the month of 50 degrees almost complete DP title (completely stolen henry_y the blog , thanks), campy sense of ritual he wanted to write a demand notice, the main purpose is to record, should not sum up (because my stroke along the process not much I learned), after all, only just started, yet in-depth study they think they do not reimbursing output shaping idea is taboo (thought without learning is perilous).

 

table of Contents

One. From the knapsack problem dynamic programming to talk about my understanding

two. The nature of dynamic programming

III. Examples section entitled

 

 

 

What is the knapsack problem

V is a capacity of the backpack, want to install n items, each item value of Wi, Vi volume, the backpack can hold items seeking the maximum value

 

Generally how knapsack problem

Search, enumeration of all the programs, to determine the feasibility (pretend to) and calculated values, to find out the maximum value of the program.

For the solution set {2,3 ,. . . , N} (expressed back wraps a first, a second member, the third member of the n items ...), there are 2 ^ n sub Solution Set (since the first element to the collection of, or retention, or removed, there are two schemes; for the second element of the collection, either retained or removed, by multiplying the previous embodiment there are two kinds of programs ^ 2, and so on), the number of the sub-set of solutions is the total number of programs . Therefore, the total time complexity of 0 (2 ^ n) 

 

DP how to solve the knapsack problem

Equation: F [i] [j] = f [i-1] [j + v [i]] + w [i]. F. [I] [j] is a state indicating an i-th considered before and after the article, as well as the maximum current value at the time j volume.

The equation is a consideration of the items i and in the end choose not vote for the process, namely the i compare selected items and do not choose the program which best. The method is considered to solve all the previously had a state (i.e., considering the state of the article before the i-1 th), and on their basis are considered the items selected from the i-th and without selected. This ensures one thing: there will be no consideration of the case. As long as this, this algorithm is able to get the right answer.

  

DP is the time complexity of how much, and why more efficient DP (Dynamic Programming) more efficient

Items are considered for each election and not an option, consider n times, on account of the i items should enumerate all the f [i-1] [j], where 0 <= j <= V. Thus the time complexity of O (nV)

Why DP more efficient? Let's use a simple example of what analogy.

 

Why consider ordering based on a comparison of the time limit is O (nlog2n)? (From mindhacks.cn)

For a given number n, there are n! Species, from which we all find out exactly the number of small to large one. Each comparison a, b, or the former is smaller than the latter, or vice versa, all but two cases of half of the total arrangement (i.e. n! / 2 species).

 

If every time a perfect 2 points, then find that the only point of the final required step is to log (n!) = O ( nlogn). So not difficult to understand what the complexity of sorting algorithms based on the comparison of the best, but so be it .

I left the pit:

1 how to derive log (n!) = O (nlogn)?

2 bubbling, fast row, select, insert, etc. should be the main difference in how the selected A, b , then each of the codes is how to highlight "how to select a, b" of the idea of it?

 

Back to the DP, can be understood by considering each of the items in the end i selected and not selected, the total possible binary program, this is the best way to go. 

 

What (abstract) What kind of knapsack problem, or that the problem is the nature of knapsack

In the "What is the knapsack problem" basis, we try universalization

Original: V is a capacity of the backpack, want to install n items, each item value of Wi, Vi volume, the backpack can hold items seeking the maximum value

analysis:

1. The capacity constraints V is backpack

2.n items is the number of decision-making, decision-making can get income, but pay the price when the cost accumulated to a certain extent (reach limitations) will not be making. (Earnings are not necessarily good, the price is not necessarily bad, such as "Taxi carpool" This question)

3. each item selected and not selected, that is not contrary to try to make a decision under limiting conditions, to maximize profits.

The question there are some hidden information

4. seek backpack can hold items of greatest value is to seek maximum benefit

5. For an item, as long as installed on the line, installed after the first load or no difference, that meet no after-effect

6. Define a state for each state, as long as may be transferred from other states, must (or must) satisfies optimal substructure, to write the state transition equation

 

Knapsack problem is essentially a dynamic programming, when the nature of our abstract knapsack problem, in fact abstract universal dynamic programming problem.

 

Thus, when the title has the following characteristics, dynamic programming can be used:

1. seeking maximum (minimum) total revenue

2. The phase-wise (to find this out)

3. Optional decision-making, so as to obtain benefits

4. Decision restrictions apply

5. The stage gains may push to (be able to transfer or partition) in front of the stage by an appropriate decision by

6. The decision does not affect the other events that meet the optimal substructure and no after-effect

 

 

How to set up using the dynamic programming features ( first default satisfy the above point 6)

  1. Clear state (such as knapsack problem f [i] [j], f corresponding to the above point 1, i corresponding to 2, j corresponding to 4)
  2. Decision substituting described (corresponding to 3,5), transfer equation is derived

 

 

remind

DP algorithm is very flexible, not to be done template (such as the transfer phase i have to i-1, states have to record the next phase of i and j restrictions, etc.) bound to figure out the nature of your definition and transfer method.

 

 

For me valuable title selected cases of:

5. squad problems

Only two decisions: new people, or join the ranks of self-contained team. When the state confirmed that the decision can be substituted into the abstract, not fully consider the points in the end how, exactly ignore these advantages DP.

 

10. The method of creative fish

Do first, "the biggest squares" have ideas.

But no matter what questions are difficult to want to shift the way, let alone a defined state.

For me the problem is.

 

15. taxi carpooling

What comes to mind is the decision (on the car can be a few people), the other is also very good demand (nothing more than a car (state) and human (volume)). It is not easy to see a backpack similar problem.

 

 14.UVA11400 Lighting System Design

Style is very foreign question, is not simple.

The decision seems obvious (with or without the original battery), but it will feel more difficult (in the end with who?)

Because of this transfer equation is rather subtle: next to each update f [i], the equivalent of a possible decision 2 get better benefits to the former f [j] (j <i) opportunities: Do you want to try try our (i) of the battery?

The final version of the transfer equation is more abstract: direct enumeration k, ik represents the i-1 have tried to use my battery. To launch this step is to really understand the f [i] of the nature of meaning (i and i previous bulbs, using up the battery before i and i)

 

 24. [USACO08JAN] Running Running

This question can be done using one-dimensional DP, without recording the state of fatigue value. Think of this point is to understand the nature of fatigue values ​​(constraints, so you have to run after a break i i s s)

Some states are defined very direct very easy to think, if we can see the nature of the subject to the conditions (a division of what stage? Limits what?) Niubi.

Similar subtle problems as well as "playing Mole"

 

 26. [USACO07FEB] cattle vocabulary The Cow Lexicon

It would have been too complicated because there is only one way: (f [i] represents the letters before i want to delete the minimum vocabulary), but at first glance is a little impossible to start.

 

 34. The leader of the garden

Abstract decision, an equal amount is the key to the solution phase DP, how abstract the most reasonable discretion of the need (in other words how to define the status of the most reasonable). Sometimes intuition is not unreliable, but may not be beautiful. 

 

 35. The cooking program  36. The operation and Development    

Adapted knapsack problem very successful title, are investigated understanding of the after-effect of. Solutions are pushing formulas, math is very difficult.

 

 39. A dispensing machine      40. A window display florist

This is almost exactly the same two questions, but lead to different problems we face is difficult to think of them put them together. And "Taxi carpool" as is highly abstract knapsack problem, help to understand the dynamic regulation.

It is also output scheme (Print function) examples

 

 41. The bubble watching sister

I think the division is not clear that at this stage. . I do question it is not enough sensitivity

 

 48. The passing notes

Deepen the understanding of the state: to record all the information points, to ensure that each state is unique

 

The End

I hope to be able to add summary

 

 

 

 

 

 What follows is only store personal information use

judge note

Carpet, reverse enumeration. Not have to use the direct method, what to think about the requirements.

Polynomial output, WA, missed a point not considered. The problem of consciousness and program segments,

Machine translation, queue

Rows of seats, structure, invocation sequencing. I did not fully understand the subject see the leaked

Time complexity, scanf ( "% d", & l); getline (cin, o). Leave blank

Sharing card, there are ideas to try hands-on, there may be some circumstances


Dynamic Programming Era
features
no after-effect
optimal substructure

Find the state, and the state transition equation


Jinming budget plan
has been stuck in primary and accessories there, do not realize that a very small number of attachments, and nothing more than to have two states become no, no, yes, there are 1,2,12 accessories.
Thinking point: notice that the main accessories can not be removed, it must be bundled. How bundling?
(Small number of attachments may be implied)
or ask what difference this question with a backpack in the
difference in the primary attachment, the attachment Where is the master?
Backpack n items, not the first match of the main attachment as different items
may only be modified by the state transition equation, and then only to find the answer - this is the key

The combined circular stone
always WA I do not know the reason, then temporarily give up, a time not programmed
day not open, suddenly found a solution to a problem with a significant difference, len - i - round k, i want to open to 2 * n
it can be said that small details can also be said to understand is not in place
most notably, had been Sike, never realized or found in nature. To avoid

Domino
knapsack problem is to change
it is impossible to easily change, so we must all start to extremes (big top than below)
begin to solve the problem, volume = number of points, the value = 1
, and so on, because the beginning is actually out of order, but bigger than you default under the above, how to solve?
Because this is related with the flip, flip, with the value of the relevant
fact, do not think too much on Follow the step by step, we must first flip the default value is 1, then if you want to turn back to get the value is 0, corresponding to -1

Nick task
impossible task for the state, only in time. But how do the task?
It had to be backwards. And although the task has a start time and end time, just look at the real start time.
Abstract really useful


Similar gene

const int tab[5][5]=
{
{5,-1,-2,-1,-3},
{-1,5,-3,-2,-4},
{-2,-3,5,-2,-2},
{-1,-2,-2,5,-1},
{-3,-4,-2,-1,0}
};

int la, lb; string sa, sb
for input
7 AGTGATG
5 GTTAG
cin >> La LB >> >> >> SA SB;
discovery can automatically ignore the spaces between the number and character
to the maximum output, the answer may be negative trap
for initialization, just 1,0, 0,1, 0,0, taking into account the ij double circulation, but also initialize i, 0, and so, in essence, no intention to initialize
Caton point
how the definition of state? How transfer?
First, there are two strings, there must be two-dimensional ij, nature is f [i, j] is the maximum, it will not be long before placed in front of it? To come up with good reasons, if not first, do not move
so the key is to shift
seems difficult to actually think about depth is very simple, draw a map, on three kinds of transfer mode

 

Passing notes
first two lines, you can directly define the 4-dimensional, there is no problem
then, two strips 1 symmetry. 2 means two simultaneous transfer paper, so the paper every time two sync state change - Key
strip not overlap, so that the state is not the last moment is positioned directly to the end point (end point anyway favorability is 0), this wonderful
to optimize sure, a breakthrough in sync change
Note: after modifying the state based on the original array bounds checking remember

 

分队问题
关于无后效性:注意当f【i】确定后,并不是说前i个已经捆绑在一起了,他仅仅表示如果数据只有前i个的话的最大值被存下来方便调用
对于这道题,只有和归到前面的队及自己带领成一队的选择。dp最重要的是不用关心具体怎么分
注意:虽然养成了检查数组的习惯,但这次取值范围数少了个0


低价购买
当初校内赛第一题乱搞的运气题
当初注意到了要将序列不同的删去,现在反而没注意到,这个是一个问题
首先错在,最后找到最大答案后要都一一统计最大答案的方案数
然后,答案(ans)可以在过程中记录,这样可以不用单独for循环
问题就只剩下如何去重了,一条式子就行


最长不下降子序列(LIS)
n方做法过
nlogn,改变状态:f[i]表示不下降序列长度为i,该序列的最后一个数是多少。
因为贪心:若两个序列长度一样,那么最后一个数较小的必然较优
这是完全转变思路,思路是初始化长度len=1,每次维护1到len的f值最小,以便每次按顺序有新的数(for i-1到n)出现时,都尽可能拓长len(当a[i]>f[len]即可)
维护的过程是二分的过程。
很妙,属于别人家的算法

最长公共子序列(LCS)(1到n的排列)
n方做法过
正解:离散化,变为LIS问题。
别人家的想法。

回文字串
原来是转换为LCS问题,考虑到回文字串本质上是找正串和反串的共同子串

 

最大正方形
一错:ans初始化为0,但是至少为1,本来判断ans=max(f[i][j])却因限制压根就没进入到判断
二错:代码非语法的其他打错了错误


创意吃鱼法
一直在想状态转移是什么
思维还是在如何抽象成正方形
其实,不要以为是曾经见过的某道题,就从这题直接思路就行。
肯定是斜边上的转移,约束条件是什么,怎样解决正方形其他地方不能有鱼,那就想,想不到就算,但最起码不要只往正方形角度靠拢
第一次WA,数组的意义从左到右从右到左当时自己都弄错了
第二次WA,这次不同了,ans不是最起码为1了,抄了上一题模板然而没改
第三次WA,转移方程整个都错了,还是套用上一题的,背离了本质。而且,第二次WA的错误说要改结果忘了
关键是,f[i][j]对于f[i-1][j-1]的,不是简单地继承不继承,这是个考虑不全的坑(用暴力的尤其注意)


prince and princess
LCS的一个变通,对于长度不同的两个序列,仍然可以离散化,然后求两者长度较短的序列的LIS(因为若有的数只有长的有,显然不可能是公共序列)

木棍加工
对于有两个关键字的,只需要对其中一个关键字排序,就变成了普通的单变量序列问题LIS

跨河
memset(a,0x3f,sizeof(a))
sum=0x3f3f3f3f表示无穷大,且该sum加上某个数不会溢出

我的方法,定义f[i][j]表示已经运了i头牛,并且最后一次运的船上有j头牛。这是我蒙出来的定义,但事实上这个j的意义看上去很迷但刚刚合适
因为开始考虑新的一头牛,要么就上原来的船,要么就为他另开一条船,而对于新开的状态是建立在搞定了前i-1头牛的基础上,那么我只需要用min值记录前i-1头牛的最小费用就行

我们考虑下题解的方法,我定义的二维的这个j真的需要吗
我是一头一头牛这样加,然后每头牛都单独考虑。那能不能爽快一点,直接用j表示床上的牛的数量
如果这样定义,好像就是一维了,但我的思路的话必须要二维
背包问题

 

出租车拼车
前面定义了变量k,而后面又用它来循环,重复定义不报错的

要注意状态是从上一辆车转移到下一辆车,而不是人数。因为人数是不分层次的,很明显是宰割品(背包的重量),认识到这一点,会发现这就是背包
f[i][j],首先i是第i辆车,j是剩余人数,意思是过了第i辆车后还剩下j人,此时的积累的总费用。
为什么j要这样定义?因为我需要求总等待时间,也就是需要当前人数(思考题目每一个条件如何覆盖或转换)
首先,还没上车的人要么不上车,此时积累上一辆车的费用加上这段等待时间
要么上车,那么f[i][j]则由f[i-1][j+z[i]]转移而来

然后就是初始化问题,不要认为f[0][1]是还没出发所以费用为0,因为初状态只有一个就是f[0][n],其余都是不合法的,状态不能从不合法的地方转移

如果该车能上那么有车位就尽量上,但当只剩一个人时有两个车位也是要上的,尾端的特殊情况要想到
这里有滚动数组,类似01背包的压缩成一维

这题让我对DP理解加深了一层


摆花
初始化要设为第一种花的所有可能的方案数为1,然后累加,想到了
f[i][j]表示到了第i盘花时还有j的空间(用上一题的思路,i表示过了这个花的讨论就下一个了),然后第三个循环k,表示该种花放多少盆


最佳课题选择
乘方pow(a,b)
cmath自带的max函数只能用于int
#define min(a,b) a<b?a:b
前面都是背包问题


能量项链
卡在很别扭
要新建一个头和尾,这样就好看些,然后列举一下样例才能解决。
for (int i=1;i<=n*2-len;i++)//start wrong,i这里不能只到n
(i,k)表示合并后的子串左端为a[i],右端为b[k],(k+1,j)同理。 因此当合并时,等于左区间左端乘左区间右端乘右区间右端
for (int i=1;i<=n;i++) ans=max(ans,f[i][i+n-1]);/// 这里i<=n漏了等号
总结:模拟化降低抽象思维难度
分治问题

 

POGO的牛Pogo-Cow
n立方的做法
怎么定义状态?因为我必须要知道该次跳跃的距离和上次跳跃的距离(比较),我可以记f[i][j]为最后一次跳跃为i到j一次跳跃的最值。
这次如果i表示已经来到了第i个平台会怎样?不行,因为虽然都是到达这个平台,但是路径不一样导致上次跳跃的距离不一样
又不可能把跳跃的距离存起来,那就存跳跃的两个端点了(表示状态)
转移方程很好推

然后我尝试单调队列优化
for i,for j,for k,我发现对于每个固定的i,只是更改终点j,那k的结果是可以一直重复用的,就想把f[k][i]做成单调队列
对queue操作搞了很久,最后调出来后发现我无法把队列pop掉,因为——
写到这里突然发现是可以的,因为i增加,j最远到n,那么i到n有变近的趋势,如果i到n(最远)都有对应的f[k][i]不符合,以后他也不会符合,就可以pop;但i到n-1不符合就不能pop了

但是这样仍然要两个for一个while,然后我突然意识到自己的路走得太远了,赶紧回头看了看题解
然后意识到了什么是真正的单调队列:两个for,另一个k++或--,在第二个for结束后,k++也到头了
<--k i j-->
这是正解,固定i不动(i放到第一层for循环),j与i距离逐渐变大,但是当j不是很远时,k也不能够离i太远,而是随着j变大逐渐解锁更远的地方,两者相互制约
一开始k从i出发,尽量往后走直到受到j的约束停了下来;当j一往后走,k也会从原先停下来的位置尽量往后走。
k--> i j-->
这是我的方法,由于当i和j拉近时(for i到n,j每次最远也到n),k也不能离i太久,也要被动向右走,
问题出在,尽管若j=n时不符合k可以pop了,但是对于k+1,仍然不能武断他是否符合(也就是在j等于哪里时才不符合)
确实是把k做成单调队列了,但pop的代价是一次j的for循环。


照明系统设计
必须电压从小到大排序
从大到小的话就是贪心,但从小到大,每次遇到一个新电源,这个必须买,但之前买过电源的可以选择不买找更优的;
即使这个新电源以后不会去买,因为下一个新电源的灯泡价格更低,那么下一个新电源出现时一定会统统搜一遍,这时就考虑了不买之前电源的情况


奶牛零食
常规题
定义状态,i记录多少天。但是今天和昨天真的无后效性吗?有的,你不知道昨天怎么拿零食,所以不知道今天怎么下手(从哪里转移)。
又考虑到状态只有两种,从左边拿和从右边拿,我们需要引入一个j来复原昨天的状态。那就是j表示从左边拿的次数了,这样右边也就能推出来


跳房子
没想到金币的效果是单调的,可以用二分。
动归也想出来了。
没想到还能用单调队列优化。
算大题吧,也卡了比较久,好多细节和启示
define inf (1<<30),这样可以直接用-inf

什么时候要longlong注意,单个数据不超累加起来就超

freopen("D:\\in.txt","r",stdin);
搞队列有关的操作(while)时,h<t的条件必须时时刻刻写上

最后一个问题,判断时小于等于漏了等于号,导致有些结果差一点然后WA。注意

最难一个问题,考虑点1,点2,点3之间距离为3,3.机器人最大跳跃距离为5正负1,
那么当j等于2时now停在了1,但当j变成3时now就可以加一,哪怕他现在反而超过了最远距离,但是也要now++啊,不然下面都走不了了,而这个不符合条件会在下面有专门语句解除
这个现在我的解释可能有点含糊,但这是我调了最久的地方,详见代码

 

乌龟棋
一开始方程给了一个状态i记录到第几格,然后一共四维,剩下一个指令的信息可以推出来。
但完全可以变形一下,因为知道任意四个就能推出第五个,那么直接推出步数就可以了,这样不会TLE。当时我没有这种意识
因为固化了一个正确的想法,很难变通到一个更好的怎么破?
很惨痛的一次教训
WA,因为N《=350,其他《=40,然后maxn就只开了50,然后爆数组了,但完全不报错,只是W,调了一个小时
递推问题

 

跑步
写转移方程时用最直观的写法就行了,比如对于疲劳值不为0时要休息,则只能休息到疲劳值为0,f[i+j][0]=max(f[i][j],f[i+j][0])。
刷表法
还有一种一维写法,因为某个点到某个点必然是跑了i时间又休息了i时间。挺妙
递推问题


挤奶的时间
和尼克的任务一起写了个博客
坑:一longlong,二a[0]结束时间要设-100,
一开始交了尼克的任务的思路,结果最后检查题目没有坑啊于是提交上去忘了开数组结果有的WA了,以为思路有问题,其实没问题。
递推问题


书本整理
一开始找定义时发现了f[i][j]剔除书时不能剔除刚刚加入的第i本书
后来发现有可能一连串若干本书都剔除掉了,而不是一本到一本的转移
都机智的发现了这些问题,当然就是反应有点慢,那就慢慢练吧
递推


积木城堡
是否有的01背包问题(装箱问题),f[j]=max(f[j],f[j-a[len][i]],可以把有和没有理解成价值。我开始时漏了这个max

音量调节
符号打错,样例刚好过
递推

机器分配
关于输出最佳分案,两种方法
1f[i][j][i]=k表示前i个公司前j台机器分掉了后,第i个公司分了多少机器,每次转移时,将第1到i-1个公司分别有多少机器从以前状态拷贝过来
2f[i][j]=k直接就好了,每次调用f[i-1][j-k]


花店橱窗布置
注意有负数的都要先检查是否要初始化-inf
循序渐进,确保这一步没有疑问再下一步。这个必须练习!!!
然后找了好久找不到从机器分配改过来的代码的错误
后来意识到,f[i][j]表示前i朵花前j个花瓶,与上一题共同点是一串连续的花瓶属于一朵花,但不同的是最后一朵花插了后后面的花瓶没用了
所以答案应该是f[n][i]而不是f[n][m]
当然还有一种写法,f[i][j]定义不变,每次选择取和不取,这种更优只用两个for循环。为什么?
这种写法我一开始初始化想的太简单,后来仔细分析才正确了初始化。
但是看别人为什么人家初始化跟我不一样都能过?
人家for(int i=1;i<=m;i++)f[i][0]=-inf;
因为我们初始化不从0开始就是为了防止从f[i][0]=0转移过来的情况,人家的初始化就是从本质入手,看来以后要慎重写代码。
题解怎么print?
这些题的print艺术感不错,可以总结总结。


教主的花园
对于树高树低, 因为只有三种树,可以一一枚举所有合法的(121,231,131等等)
但对于这些条件,完全有可能有更优的定义,如定义[0]表示树低,[1]表示树高


烹调方案
问题在于对于f[i][j](二维背包),设前i个物品里有物品i和j,对于i,j先枚举哪个是有讲究的(蛋糕在融化且融化效率不同)
题解是对于每一个i,j都比较然后排序,因为阻碍的本质是无法确定f[i][j]里面物品的顺序,这里顺序影响答案。
要么就开多一维存状态,但这里最优顺序是可以式子化简比较出来的,所以直接排序即可
有意思的是,排序的本质是两个东西基于比较的排序,而不只是单纯的比大小

经营与开发
与上题一样有后效性,秦九韶算法拆开,倒着枚举就好


道路游戏
大概转移方程大概能推出来,当时用的是f[i][j]表示i时刻过了j道路。
问题1:解决前缀和问题,需要找原点,用点数学烧电脑其实还好。
昨天晚上写的大概,然后不想调了,今天早上一看发现之前很多细节都是错的,看来真的要一个字一个字的抠意思看
测试样例时突然发现因为每次重新买机器人都要指定地点,原来第二维的j没用
事实证明最后大概也能过了,就是代码有点不优美,导致调试和检查时需要花更多时间,这点怎么该???
DP[i][j]=DP[i-1][j]+DP[i][j-1]-DP[i-1][j-1]+map[i][j]二维前缀和

满分要二维单调队列优化,觉得太麻烦了不写了。

47 41 27 50

字串距离
scanf("%s%s",a+1,b+1);
int m=strlen(a+1),n=strlen(b+1);
前面+1后面也要+1


牛的词汇
f[i]表示第i位之后的最少删减数,然后推转移,暴力枚举就行了。怎么想到的?


牛交通
对于一条边a-b(a<b)
我们计算出来所有的入度为0的点到a的方案,在计算n点到b的方案
两者相乘,岂不是所有入度为0 的点到n且经过这条边的方案
原来题目是求边,f[i]只是记录点的
然后dfs意义搞错了,dfs(n)是终点为n的dfs,只是因为回溯才反过来了,对于a<b,入度为0的点到a的方案是通过dfs(n)来求的


看球泡妹子
数组开太大了,结果memset效率很低
一开始的思路有点乱来,想着可以什么读入合并到一起,还没有推导好公式就顺着感觉码代码,当然错了

Guess you like

Origin www.cnblogs.com/reshuffle/p/11511696.html