社区讨论

萌妹求助,矿工配餐

P4401[IOI 2007] Miners 矿工配餐参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi7unobp
此快照首次捕获于
2025/11/21 03:54
4 个月前
此快照最后确认于
2025/11/21 03:54
4 个月前
查看原帖
RT QWQ
WA QWQ
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
using std::cin;
using std::cout;
using std::endl;
int n;
int dp[2][4][4][4][4];
int change(char c)
{
	switch (c)
	{
		case 'M':
			return 1;
		case 'F':
			return 2;
		case 'B':
			return 3;
	}
	cout<<"stupid chen_zhe\n";
	return -1;
}
int main()
{
	cin>>n;
	cin.get();
	char c;
	int kind;
	for (int i=1; i<=n; ++i)
	{
		c=cin.get();
		kind=change(c);
		for (int j=0; j<=3; ++j)
			for (int k=0; k<=3; ++k)
				for (int x=0; x<=3; ++x)
					for (int y=0; y<=3; ++y)
					{
						if (j==0&&k==0)
							dp[i&1][k][kind][x][y]=std::max(dp[i&1][k][kind][x][y], dp[i&1^1][j][k][x][y]+1);
						else if (k==0)
							continue;
						else if (j==0)
						{
							if (k==kind)
								dp[i&1][k][kind][x][y]=std::max(dp[i&1][k][kind][x][y], dp[i&1^1][j][k][x][y]+1);
							else
								dp[i&1][k][kind][x][y]=std::max(dp[i&1][k][kind][x][y], dp[i&1^1][j][k][x][y]+2);
						}
						else
						{
							if (kind==j&&j==k)
								dp[i&1][k][kind][x][y]=std::max(dp[i&1][k][kind][x][y], dp[i&1^1][j][k][x][y]+1);
							else if (kind==j||j==k||k==kind)
								dp[i&1][k][kind][x][y]=std::max(dp[i&1][k][kind][x][y], dp[i&1^1][j][k][x][y]+2);
							else
								dp[i&1][k][kind][x][y]=std::max(dp[i&1][k][kind][x][y], dp[i&1^1][j][k][x][y]+3);
						}
						if (x==0&&y==0)
							dp[i&1][j][k][y][kind]=std::max(dp[i&1][j][k][y][kind], dp[i&1^1][j][k][x][y]+1);
						else if (y==0)
							continue;
						else if (x==0)
						{
							if (k==kind)
								dp[i&1][j][k][y][kind]=std::max(dp[i&1][j][k][y][kind], dp[i&1^1][j][k][x][y]+1);
							else
								dp[i&1][j][k][y][kind]=std::max(dp[i&1][j][k][y][kind], dp[i&1^1][j][k][x][y]+2);
						}
						else
						{
							if (kind==x&&x==y)
								dp[i&1][j][k][y][kind]=std::max(dp[i&1][j][k][y][kind], dp[i&1^1][j][k][x][y]+2);
							else if (kind==x||x==y||y==kind)
								dp[i&1][j][k][y][kind]=std::max(dp[i&1][j][k][y][kind], dp[i&1^1][j][k][x][y]+2);
							else
								dp[i&1][j][k][y][kind]=std::max(dp[i&1][j][k][y][kind], dp[i&1^1][j][k][x][y]+2);
						}
					}
	}
	int ans=0;
	for (int i=0; i<=3; ++i)
		for (int j=0; j<=3; ++j)
			for (int k=0; k<=3; ++k)
				for (int l=0; l<=3; ++l)
					ans=std::max(ans, dp[n&1][i][j][k][l]);
	cout<<ans<<endl;
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...