【bzoj3791】作业 dp

来源:互联网 发布:蜂窝移动数据选项漫游 编辑:程序博客网 时间:2024/06/16 07:38
最后整个序列最多被分为2K-1段黑白相间,因为每次等价于插入2个端点
换种说法,只要是被分成不超过2K-1个黑白相间的段,那么就可以用最多K次解决
dp[i][j][0/1]表示前i个数,用了j段最后一段为黑还是白的总数

有点厉害


#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int f[100010][100][2];int n,m,k;int main(){scanf("%d%d",&n,&k);memset(f,-1,sizeof(f));f[0][0][0]=f[0][0][1]=0;for (int i=1;i<=n;i++){int x;scanf("%d",&x);for (int j=1;j<=min(2*k-1,i);j++)  for (int k=0;k<2;k++)  {    f[i][j][k]=f[i-1][j][k]+(x==k);    for (int p=0;p<2;p++)      f[i][j][k]=max(f[i][j][k],f[i-1][j-1][p]+(x==k));  }}int ans=0;for (int i=1;i<=2*k-1;i++) ans=max(ans,max(f[n][i][0],f[n][i][1]));printf("%d\n",ans);return 0;}


0 0
原创粉丝点击