题解:P4749 [CERC2017] Kitchen Knobs
简要题意
有
主要算法
dp,差分。
主要思路
题目转化
题目转化
题目转化
dp 方程:
dp 优化:
dp 转移:考虑加一个元素不增加部份数 ,所以将
代码
#include <bits/stdc++.h>
using namespace std;
const int N=510;
#define int long long
int n,ans,wz[10],col[10],b[N],cnt[10],mx[N];
short f[N][N][N];
signed main()
{
// ios::sync_with_stdio(0);
// cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
bool flag=1;
cin>>wz[0];
if(wz[0]%1111111==0)
{
i--,n--;
continue;
}
for(int j=1;j<=6;j++)
{
wz[j]=(wz[j-1]%1000000)*10+wz[j-1]/1000000;
if(wz[j]>wz[mx[i]])mx[i]=j;
}
}
for(int i=1;i<=n;i++)cnt[(mx[i]-mx[i-1]+7)%7]++;
// for(int i=1;i<=6;i++)cout<<cnt[i]<<' ';
ans+=max(cnt[1],cnt[6])+max(cnt[2],cnt[5])+max(cnt[3],cnt[4]);
col[1]=cnt[1]>cnt[6]?1:6;col[2]=cnt[2]>cnt[5]?2:5;col[3]=cnt[3]>cnt[4]?3:4;
cnt[3]=abs(cnt[3]-cnt[4]);cnt[1]=abs(cnt[1]-cnt[6]);cnt[2]=abs(cnt[2]-cnt[5]);
for(int a1=0;a1<=cnt[1];a1++)
for(int a2=0;a2<=cnt[2];a2++)
for(int a3=0;a3<=cnt[3];a3++)
{
f[a1][a2][a3]+=(a3*col[3]+a2*col[2]+a1*col[1])%7==0;
f[a1+1][a2][a3]=max(f[a1+1][a2][a3],f[a1][a2][a3]);
f[a1][a2+1][a3]=max(f[a1][a2+1][a3],f[a1][a2][a3]);
f[a1][a2][a3+1]=max(f[a1][a2][a3+1],f[a1][a2][a3]);
}
printf("%lld\n",ans+1-f[cnt[1]][cnt[2]][cnt[3]]);
return 0;
}
注意事项
如果所有数相同则没有最优位置,直接不管就行了。