题面:
你在玩一个叫做\(Jongmah\)的游戏,你手上有\(n\)个麻将,每个麻将上有一个在\(1\)到\(m\)范围内的整数\(a_i\)。这些麻将可以有两种方式组成三元组:
- 1>每个三元组中的元素是相同的
- 2>每个三元组中的元素是连续的
求最多形成的三元组个数
题解:
很明显这不是个贪心(虽然第一眼看上去有点像),然后就想到了DP。如何进行DP呢?
要有dp[m]
表示进行到第\(m\)位时最多形成的三元组个数,但明显无法进行DP,还需要知道sum[i+1],sum[i],sum[i-1]
的剩余个数,但知道其中两个就可以知道剩下的一个,所以可以设为dp[i][j][k]
表示第\(i\)位用\(j\)个,第\(i-1\)位用\(k\)个
枚举第\(i-1\)位,\(i\)位,\(i+1\)位的选择个数即可
for(int i=1;i<=m;i++)
for(int a=0;a<3;a++)
for(int b=0;b<3;b++)
for(int c=0;c<3;c++){
if(a+b+c>sum[i])continue;
if(b+c>sum[i+1])continue;
if(c>sum[i+2])continue;
dp[i][c][b]=max(dp[i][c][b],dp[i-1][b][a]+c+(sum[i]-a-b-c)/3);
}