dp求助
查看原帖
dp求助
338786
mushroom_knight楼主2020/6/26 18:34

Rt

我用的是从后往前推+记忆化

但是0分……

#include<bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int memre[51][51][51][51]={0};
bool vis[51][51][51][51]={0};
int score[500]={0};
int card[5];	
int n,m;
int dp(int w,int x,int y,int z){
	if(w==0&&x==0&&y==0&&z==0){
		return score[1];
	}
	if(vis[w][x][y][z]){
		return memre[w][x][y][z];
	}
	int now=w+x*2+y*3+z*4;
	if(w){
		memre[w][x][y][z]=max(memre[w][x][y][z],dp(w-1,x,y,z));
	}
	if(x){
		memre[w][x][y][z]=max(memre[w][x][y][z],dp(w,x-1,y,z));
	}
	if(y){
	    memre[w][x][y][z]=max(memre[w][x][y][z],dp(w,x,y-1,z));
	}
	if(z){
		memre[w][x][y][z]=max(memre[w][x][y][z],dp(w,x,y,z-1));
	}
	memre[w][x][y][z]+=score[now+1];
	vis[w][x][y][z]=true;	
	return memre[w][x][y][z];
}
int main(){
	IO;
	cin>>n>>m;
	for(register int i=1;i<=n;++i){
		cin>>score[i];
	}
	while(--m){
		int i;
		cin>>i;
		card[i]++;
	}
	cout<<dp(card[1],card[2],card[3],card[4]);
	return 0;
}
2020/6/26 18:34
加载中...