杂题8.25

· · 个人记录

T1:luogu2237

1,sort可以对string类按字典序排序 2,善用substr函数

T2:luogu3077

对边排序(左端点为第一关键字,右端点为第二关键字) 这时候被这条边连接的两个点便可以状态转移。 我们设dpa[i]表示左边以i结尾的最大收益, dpb[i]表示右边以i结尾的最大收益。

当存在边i,j时

FL[i]=max{DL[i]+FR[j]}

转移的时候拿两个临时变量存一下就行了

T3:luogu1350

将棋盘分为两个矩形,

枚举第一个矩形里放多少棋子,在计算即可

T4:luogu4894

运用向量差积求法向量即可

T5:luogu2564

滑窗法

T6: 与月球上的消防员类似,贪心

暴力判断一个点有没有被覆盖

T7: 枚举第一行的状态,推出后几行的

T8:luogu2885

dp

dp[i][j]表示现在dp到第i棵树,第i棵树高为j的最小代价

dp[i][j]=min(dp[i][j],dp[i-1][k]+abs(k-j)c+(j-a[i])(j-a[i]));

T9:luogu2530

dp dp状态:dp[i][j][k][m] : 前i个物品 当前手中有j个"A" k个"B" m个"C"时的最小卸货次数

取出来

dp[i][j][k][m] = dp[i-1][j-1][k][m] if(ob[i]=='A' && j)

dp[i][j][k][m] = dp[i-1][j][k-1][m] if(ob[i]=='B' && k)

dp[i][j][k][m] = dp[i-1][j][k][m-1] if(ob[i]=='C' && m)

装箱

dp[i][0][k][m] = dp[i][j][k][m] + 1 ;

dp[i][j][0][m] = dp[i][j][k][m] + 1 ;

dp[i][j][k][0] = dp[i][j][k][m] + 1 ;

T10:luogu3166

对于点(a,b) (x,y)连成的线段而言(其中a>x,b>y),

在它们中间有gcd(a-x,b-x)-1个整点

因此基本的思路就是枚举两个点,

然后第3个点就是gcd(a-x,b-x)-1种可能

然而这样复杂度太高,于是可以发现,可以将这两个点组成的线段中左下那个端点平移至原点,

这样相当于只要枚举一个点,并且由于要考虑k<0的情况,因为矩形是有对称性的,

所以要求原点+一个点 与 (0,m)+一个点 的和就可以直接2 *(原点+一个点)

由于长的一样的线有很多,于是问题就转化为如果求这些一样的线的个数,

那么可以发现,这样任意一条线,向上只能平移(n - i),向下(m - j)次,

所以可能性就为(n - i + 1) * (m - j + 1),其中+1是因为可以向上移动0个单位

但由于这里n,m一开始就加了1,所以这个式子就不用+1了

因此枚举每个点即可