Mr Young's Picture Permutations
前面这儿写了挺多道辣,,,懒得写辣$QAQ$
LCIS
同上$QwQ$
Mobile Service
无脑$dp$入门题,,,?
设$f_{i,j,k}$表示时间$i$没站在$d_{i}$的两个人的坐标,然后只要记得判下说任意俩人不能站在同一个位置就欧克,,,$QwQ$
然后$i$显然是不需要的只是为了方便表述设的这一维,,,实际$code$中是不会有这一维的昂$QwQ$
哦话说,这样儿说着很简单,其实好像是要证个东西,,,就三个人的坐标一定都是移动到$d_{i}$,不可能移动到别的位置,,,$umm$过于显然不证了,,,只是$cue$下其实是要证这个东西的来着$QAQ$
$over$,代码咕了,可能10点多再放$QAQ$?
Making the Grade
同上$QwQ$
传纸条
又双叒是个$dp$无脑入门题,,,?
首先四维$dp$过于显然不想写了,,,
然后考虑四位压成三维,依然太显然了,,,不写辣/$kel\ kel\ kel$
反正大致思路就上面这样儿的,懒得写了$over$
对了,这个$code$是我去年9月份写的了(,,,我那个时候做的题居然这么水,,,?太菜了嘤嘤嘤),,,所以贼丑但我也懒得改了$QAQ$
View Code#include<bits/stdc++.h> using namespace std; int a[55][55]; int f[110][55][55]; int read() { char ch; int x=0; bool o=0; ch=getchar(); while(ch!='-' && (ch<'0' || ch>'9'))ch=getchar(); if(ch=='-')o=1; while(ch>='0' && ch<='9') { x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } if(o==1)return -x; return x; } int main() { int m,n; m=read(); n=read(); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++)a[i][j]=read(); memset(f,-1,sizeof(f)); f[2][1][1]=0; for(int k=3;k<m+n;k++) for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) { f[k][i][j]=max(f[k][i][j],max(f[k-1][i][j],max(f[k-1][i-1][j],max(f[k-1][i][j-1],f[k-1][i-1][j-1]))))+a[k-i][i]+a[k-j][j]; if(f[k][i][j]==a[k-i][i]+a[k-j][j]-1)f[k][i][j]=-1; } printf("%d",f[m+n-1][n-1][n]); return 0; }
I-country
相对而言还是比较有趣的辣,,,?
$so$大概港下$QwQ$
首先考虑怎么设状态?
首先理解下题意昂,这个所谓凸壳,其实就说要求左端点先递减后递增,右端点先递增后递减
于是显然就考虑状态为$f_{i,j,l,r,gd,gs}$,表示选到第$i$行,选了$j$个,左端点到$l$,右端点到$r$,左端点递增递减状态为$gd$,右端点递增递减状态为$gs$
转移,表述比较麻烦但并不难想,,,?就先不写辣$QwQ$
↑
以上是口胡,如果有锅打完代码来$upd$,如果有难点我没发现打完代码来$upd$,$over$
Cookies
这题挺有趣的,,,就这题和之前做过的一道题有点儿像,,,这个,虽然是道绿但我印象还挺深的,,,因为它是这样儿的,就,有一部分之间是无后效性的,但有一部分是有后效性的,,,
这题也是,首先要想到,显然从多往少安排,所以这时候显然有个小小的贪心,就说$g_{i}$越大的拿到的饼干数越多,于是就先按$g_{i}$排个序,然后考虑设$f_{i,j,k}$表示分到第$i$个孩子了,然后分了$j$个饼干,这一个孩子拿了$k$个饼干,看数据范围,发现$O(NM^{2})$,就不太星$QAQ$
好然后再仔细思考下,假如现在有$m$块,显然先平均分,每人拿到$\left \lfloor \frac{m}{n} \right \rfloor$块,这样儿就能把$m$控制在$n$范围以内,就过辣!
然后就被$hack$辣嘤嘤嘤
来我先$hack$下我的无脑优化想法$QAQ$
比如有5个,分别是$inf,inf,inf,inf,0$,然后有13块饼干
如果先贪心,就先均分,每人2个,剩3个,然后这时候$dp$下,显然是前三个每人拿一个,然后代价就是$3\cdot inf$
但是正解应该是,前四个人每人拿3个,然后最后一个人拿1个,这样儿代价就是0,,,
所以就被$hack$了\$kel\ kel\ kel$
而且上面这个还有个问题在于,可以有相等的,就会导致并不知道到底有多少个比它大的$qwq$
好然后现在整个儿都被$hack$了嘤嘤嘤,,,
重写下解法嘤嘤嘤
这里要考虑,状态缩放,也就是通过等价交换使得时间复杂度变好看
先用下万能的分类讨论法$QwQ$
对了先说下,$i$表示的是第$i$个人,$j$表示的是分了$j$块饼干,$k$表示的是从第$k$个人开始所有人都只有1块
1)第$i$个人获得的饼干数>1
这个可以等价与分配$j-i$个饼干给前$i$个人,没人少拿一块,这个显然是等价的$QwQ$,因为相对大小是不变的(这个就和前面那个均分有点儿像,,,是不是$QwQ$
这样儿转移就可以变成,$f_{i,j}=f_{i-1,j-i}$
2)第$i$个人获得的饼干数=1
直接考虑在它及之前有多少个人只有1块?
这样儿转移就可以变成$f_{i,j}=(f_{k,j-(i-k)}+k\cdot \sum_{p=k+1}^{i}g_{p})_{min}$
综上,转移就是$f_{i,j}=(f_{i-1,j-i},(f_{k,j-(i-k)}+k\cdot \sum_{p=k+1}^{i}g_{p})_{min})_{min}$
就做完啦啦啦啦
数字组合
无脑$dp$,,,?
考虑设$f_{i,j}$表示前$i$个数拼出$j$的方案数,无脑背包下就好,,,?
$over$
自然数拆分
又是个无脑$dp$,,,
考虑设$f_{i}$表示拼出$i$的方案数,于是有$f_{i}=\sum f_{j}+f_{i-j}$
$over$
Jury Compromise
同上
Coins
同上
石子合并
无脑区间$dp$
设$f_{l,r}$,表示$[l,r]$的最小代价,做完了
几百年前的代码,贼丑,$QAQ$
View Code#include<bits/stdc++.h> using namespace std; int n,m,a[210],f[222][222],f1[222][222],sum[404],q=0,ww,e,maxl=0,minl=999999999,i,j,l; int main() { cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; a[i+n]=a[i]; } for(i=1;i<=2*n;i++)sum[i]=sum[i-1]+a[i]; for(l=2;l<=n;l++) { for(i=1;i<=2*n-l+1;i++) { j=i+l-1; f[i][j]=999999; f1[i][j]=0; for(int k=i;k<=j-1;k++) { f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum[j]-sum[i-1]); f1[i][j]=max(f1[i][j],f1[i][k]+f1[k+1][j]+sum[j]-sum[i-1]); } } } for(i=1;i<=n;i++) { maxl=max(maxl,f1[i][i+n-1]); minl=min(minl,f[i][i+n-1]); } cout<<minl<<endl<<maxl; return 0; }