NC16590乌龟棋

乌龟棋

有n个格子,1为起点,n为终点
每个格子有一个分数每个格子有一个分数
有m种卡片,每种卡片有数字1,2,3,4有m种卡片,每种卡片有数字1,2,3,4
代表能走的步数代表能走的步数
走到一点取的该点分数,所有卡片相加恰好到n走到一点取的该点分数,所有卡片相加恰好到n
求最大能得到的分数求最大能得到的分数

需要注意的是,每一种牌的点数只有1,2,3,4

如果我们使用,暴力搜索哦,那就是4120
这个是肯定不行的。跟根据数据范围不妨考虑dp。
但是怎么做这个dp数组呢?
dp[a][b][c][d]表示使用了a张1点,b张2点,c张3点,d张4点时最多可以得到的分数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <deque>
#include <bitset>
using namespace std;
#define lowbit(x) x&-x
#define ll long long
#define dob double
#define For(i,s,n) for(int i = s;i <= n;i++)
#define mem0(a) memset(a,0,sizeof a)
#define gcd(a,b) __gcd(a,b)
const int N = 125;
const double eps = 1e-6;
const ll mod = 2333;
const int inf = 0x3f3f3f3f;
void read(int &res){
    char c;bool flag = true;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
ll s[N*100],dp[N][N][N][N] = {0};
ll n,m,num[5] = {0};

int main(){
    ios::sync_with_stdio(false);
    cout.tie(NULL);
    while(cin>>n>>m) {
        For(i,1,n){
            cin>>s[i];
        }
        For(i,1,m){
            ll t;
            cin>>t;
            num[t]++;
        }
        for(int i = 0; i <= num[1]; i++) {
            for(int j = 0; j <= num[2]; j++) {
                for(int k = 0; k <= num[3]; k++) {
                    for(int l = 0; l <= num[4]; l++) {
                        int pos = 1 + i + 2 * j + 3 * k + 4 * l;
                        if(i)   dp[i][j][k][l] = max(dp[i][j][k][l], dp[i - 1][j][k][l] + s[pos - 1]);
                        if(j)   dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j - 1][k][l] + s[pos - 2]);
                        if(k)   dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k - 1][l] + s[pos - 3]);
                        if(l)   dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k][l - 1] + s[pos - 4]);
                    }
                }
            }
        }
        cout<<dp[num[1]][num[2]][num[3]][num[4]] + s[n]<<endl;
    }
    return 0;
}
posted @ 2021-02-22 22:34  Paranoid5  阅读(43)  评论(0编辑  收藏  举报