【动态规划】洛谷P1541--乌龟琪

一个想通了就超级简单困难的动态规划
不翻题解想不到系列

#include<bits/stdc++.h>
using namespace std;
const int maxn=50;
int fs[500];
int four[5];
int f[maxn][maxn][maxn][maxn];//动态规划方程意思:使用1号牌,2号牌,3号牌,4号牌分别为i个,j个,k个和l个时候所获得的分数,
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>fs[i];
	}
	int a;
	for(int i=1;i<=m;i++){
		cin>>a;
		four[a]++;
	}
	f[0][0][0][0]=fs[1];
	for(int i=0;i<=four[1];i++){
		for(int j=0;j<=four[2];j++){
			for(int k=0;k<=four[3];k++){
				for(int l=0;l<=four[4];l++){
					int r=i+j*2+k*3+l*4+1;
					if(i) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+fs[r]);
					if(j) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+fs[r]);
					if(k) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+fs[r]);
					if(l) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+fs[r]);
					//cout<<f[i][j][k][l]<<endl;
				}
			}
		}
	}
	cout<<f[four[1]][four[2]][four[3]][four[4]]<<endl;;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_44833767/article/details/104270312
今日推荐