好菜好菜好菜好菜...又是被小朋友们吊打的一次呢
T1 祖玛游戏(OJ考试1281-C)
记忆化搜索 状态f[x][y][z]记录x-y区间,y后有z个与y相同的颜色弹珠全部消除所需代价
贴个码:
#pragma GCC optimize(3) #include<bits/stdc++.h> using namespace std; int n,k,c[105],f[105][105][105]; #define inf 0x3f3f3f3f int dp(int x,int y,int z){ if(y<x) return 0; if(f[x][y][z]!=inf) return f[x][y][z]; // if(x==y) return f[x][y][z]=k-z-1; int p=y;while(p>=x&&c[p]==c[y]) p--; f[x][y][z]=dp(x,p,0)+max(k-z-y+p,0); for(int i=x;i<=p;i++){ if(c[i]==c[y]&&c[i]!=c[i+1]) f[x][y][z]=min(f[x][y][z],dp(x,i,z+y-p)+dp(i+1,p,0)); }return f[x][y][z]; }int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",c+i); memset(f,0x3f,sizeof(f)); printf("%d",dp(1,n,0)); return 0; }
T2:赛事直播 树形dp 太菜了没调出来
#pragma GCC optimize(3) #include<bits/stdc++.h> using namespace std; #define N 3005 #define inf 1044266559 struct node{int ed,nxt,len;}e[N]; int n,p,f[N][N],val[N],cnt[N],lst[N],tot; void dfs(int x){ if(!lst[x]){cnt[x]=1;return;} for(int i=lst[x];i;i=e[i].nxt){ dfs(e[i].ed);cnt[x]+=cnt[e[i].ed]; } }void dp(int x){ if(!lst[x]){f[x][1]=val[x];return;} for(int i=lst[x];i;i=e[i].nxt){ dp(e[i].ed); for(int j=cnt[x];~j;j--){ for(int k=1;k<=min(j,cnt[e[i].ed]);k++){ f[x][j]=max(f[x][j],f[e[i].ed][k]+f[x][j-k]-e[i].len); } } } }int main(){ scanf("%d%d",&n,&p); for(int i=1;i<=n-p;i++){ int t;scanf("%d",&t); while(t--){ int x,y;scanf("%d%d",&x,&y); e[++tot].ed=x,e[tot].len=y,e[tot].nxt=lst[i],lst[i]=tot; } }for(int i=n-p+1;i<=n;i++) scanf("%d",val+i); dfs(1);memset(f,-0x3f,sizeof(f)); for(int i=1;i<=n;i++) f[i][0]=0;dp(1); for(int i=p;~i;i--){ if(f[1][i]>=0) return printf("%d",i),0; }return 0; }
T3:菜园看守 线段树优化dp或图论最短路 像个傻子一样写了个区间修改线段树
#pragma GCC optimize(3) #include<bits/stdc++.h> using namespace std; #define N 10005 #define inf 0x3f3f3f3f3f3f3f3f #define ll long long struct node{ll st,ed,s;}a[N]; bool cmp(node a,node b){return a.st<b.st;} ll n,A,B,f[N*11],mn[N*40]; void build(ll p,ll l,ll r){ mn[p]=inf;ll mid=(l+r)>>1; if(l==r) return;build(p<<1,l,mid);build(p<<1|1,mid+1,r); }void modify(ll p,ll l,ll r,ll x,ll k){ if(l==r){mn[p]=min(mn[p],k);return;} ll mid=(l+r)>>1; if(x<=mid) modify(p<<1,l,mid,x,k); else modify(p<<1|1,mid+1,r,x,k); mn[p]=min(mn[p<<1],mn[p<<1|1]); }ll query(ll p,ll l,ll r,ll x,ll y){ if(x<=l&&y>=r) return mn[p]; ll mid=(l+r)>>1,res=inf; if(x<=mid&&y>=l) res=min(res,query(p<<1,l,mid,x,y)); if(y>mid&&x<=r) res=min(res,query(p<<1|1,mid+1,r,x,y)); return res; }int main(){ scanf("%lld%lld%lld",&n,&A,&B);A++,B++;build(1,1,B); for(ll i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].st,&a[i].ed,&a[i].s),a[i].st++,a[i].ed++; sort(a+1,a+1+n,cmp);memset(f,0x3f,sizeof(f)); if(a[1].st>A) return puts("-1"),0; f[a[1].ed]=a[1].s;modify(1,1,B,a[1].ed,f[a[1].ed]); for(ll i=2;i<=n;i++){ f[a[i].ed]=min(f[a[i].ed],query(1,1,B,a[i].st-1+(a[i].st==1),a[i].ed)+a[i].s); //if(f[a[i].ed]>=inf) return puts("-1"),0; modify(1,1,B,a[i].ed,f[a[i].ed]); }printf("%lld",f[B]==inf?-1:f[B]); return 0; }
T4:石头剪刀布 概率签到题(慈善) 幸亏有它 才没爆零 懒得贴码了