请问是怎么保证不选上次选过的卡片?
查看原帖
请问是怎么保证不选上次选过的卡片?
105820
阿尔托莉雅丶楼主2021/12/7 17:19
#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 351;   //remember to modify the range of the data!!
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
typedef long long ll;

int n, m, t;    
int f[41][41][41][41]; //四种牌分别用了多少张所得分数
int a[N], b[N];

int main(void)
{
    cin >> n >> m;
    int s1 = 0, s2 = 0, s3 = 0, s4 = 0;
    for(int i = 1; i <= n; i++) 
        cin >> a[i];
    for(int i = 1; i <= m; i++)
    {
        cin >> b[i];
        switch (b[i])
        {
        case 1:
            s1++;
            break;
        case 2:
            s2++;
            break;
        case 3:
            s3++;
            break;
        case 4:
            s4++;
            break;
        }
    }

    f[0][0][0][0] = a[1];
    for(int i = 0; i <= s1; i++)
        for(int j = 0; j <= s2; j++)
            for(int k = 0; k <= s3; k++)
                for(int l = 0; l <= s4; l++)
                {
                    int now = i + 2 * j + 3 * k + 4 * l + 1;
                    if(i)
                        f[i][j][k][l] = max(f[i - 1][j][k][l] + a[now], f[i][j][k][l]);
                    if(j)
                        f[i][j][k][l] = max(f[i][j - 1][k][l] + a[now], f[i][j][k][l]);
                    if(k)
                        f[i][j][k][l] = max(f[i][j][k - 1][l] + a[now], f[i][j][k][l]);
                    if(l)
                        f[i][j][k][l] = max(f[i][j][k][l - 1] + a[now], f[i][j][k][l]);
                }
    cout << f[s1][s2][s3][s4];
    return 0;
}

这是我抄袭参考题解写的,但是不明白是如何保证不选上次选过的卡片

2021/12/7 17:19
加载中...