• NOIP2010 乌龟棋


    题意简化

    传送门
    给定n个格子,每个格子均有其贡献,与m次前进(每次前进距离在14之间,顺序随机),1n最大化其价值
    (n<=350,m<=120)

    题解

    先确定大致方向,显然是个背包
    然后...
    不妨设 (f[a][b][c][d]) 为用了a张1牌,b张2牌,c张3牌,d张4牌的最大答案
    当前所在的位置就是 (a+b*2+c*3+d*4)
    接着暴力DP就好

    代码

    #include<bits/stdc++.h>
    #define rnt register int
    #define c f[c1][c2][c3][c4]
    using namespace std;
    int f[45][45][45][45],a[395],b1,b2,b3,b4,n,m;
    int main()
    {
        cin>>n>>m;
        for(rnt i=1;i<=n;i++)
        cin>>a[i];
        for(rnt i=1;i<=m;i++)
        {
            rnt x;cin>>x;
            if(x==1)b1++;else if(x==2)b2++;else if(x==3)b3++;
            else b4++;
        }
        f[0][0][0][0]=a[1];
        for(rnt c1=0;c1<=b1;c1++)
    		for(rnt c2=0;c2<=b2;c2++)
    			for(rnt c3=0;c3<=b3;c3++)
    				for(rnt c4=0;c4<=b4;c4++)
    				{
    					long long k=1+c1+c2*2+c3*3+c4*4;
    					if(c1!=0)c=max(c,f[c1-1][c2][c3][c4]+a[k]);
    					if(c2!=0)c=max(c,f[c1][c2-1][c3][c4]+a[k]);
    					if(c3!=0)c=max(c,f[c1][c2][c3-1][c4]+a[k]);
    					if(c4!=0)c=max(c,f[c1][c2][c3][c4-1]+a[k]);
    				}
        cout<<f[b1][b2][b3][b4];
    }
    
  • 相关阅读:
    HTTP状态码的详细解释,供参考
    js中实现页面跳转(返回前一页、后一页)
    CRUD工程师——基础容器LinkedList
    CRUD工程师——基础容器ArrayList
    Servlet入门
    Linux
    flex弹性布局
    div布局
    递归函数
    运算符
  • 原文地址:https://www.cnblogs.com/yzhx/p/10804258.html
Copyright © 2020-2023  润新知