好菜好菜好菜好菜...又是被小朋友们吊打的一次呢

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:石头剪刀布 概率签到题(慈善) 幸亏有它 才没爆零 懒得贴码了

posted on 2021-03-15 19:51  Aurora-Sley  阅读(31)  评论(0)    收藏  举报



Live2D