杂题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了
因此枚举每个点即可