社区讨论
萌妹求助,矿工配餐
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 条回复,欢迎继续交流。
正在加载回复...