[BZOJ1737][Usaco2005 jan]Naptime 午睡时间(dp)
2017-04-17 10:58
337 查看
题目描述
传送门题目大意:给出一个n个数的数列,从中选出m个数,要求选的每一段连续的区间中第一个数都没有贡献,求最大值。
题解
f(i,j,0/1/2,0/1/2)表示选了i个数,选到第j个数,第j个数不选/选了不算贡献/选了算贡献,第一个数不选/选了不算贡献/选了算贡献的最大值目标状态只有f(m,n,0,2)是不合法的
加一个滚动数组优化
代码
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define N 4000 int n,m,ans; int a ,f[2] [3][3]; int Max(int a,int b,int c) { if (a<b) a=b; if (a<c) a=c; return a; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) scanf("%d",&a[i]); memset(f,128,sizeof(f)); for (int i=1;i<=n;++i) f[0][i][0][0]=0; for (int i=1;i<=m;++i) { memset(f[i&1],128,sizeof(f[i&1])); for (int j=i;j<=n;++j) { if (i==1&&j==1) { f[i&1][j][0][0]=0; f[i&1][j][1][1]=0; f[i&1][j][2][2]=a[1]; continue; } for (int k=0;k<=2;++k) { f[i&1][j][0][k]=Max(f[i&1][j-1][0][k],f[i&1][j-1][1][k],f[i&1][j-1][2][k]); f[i&1][j][1][k]=max(f[(i-1)&1][j-1][0][k],f[(i-1)&1][j-1][1][k]); f[i&1][j][2][k]=max(f[(i-1)&1][j-1][1][k],f[(i-1)&1][j-1][2][k])+a[j]; } } } for (int i=0;i<=2;++i) for (int j=0;j<=2;++j) { if (i==0&&j==2) continue; ans=max(ans,f[m&1] [i][j]); } printf("%d\n",ans); }
相关文章推荐
- 【bzoj1737】[Usaco2005 jan]Naptime 午睡时间 dp
- bzoj 1737: [Usaco2005 jan]Naptime 午睡时间 (DP)
- BZOJ1737 [Usaco2005 jan]Naptime 午睡时间
- BZOJ 1677: [Usaco2005 Jan]Sumsets 求和( dp )
- 【BZOJ】1677: [Usaco2005 Jan]Sumsets 求和(dp/规律)
- bzoj 1677: [Usaco2005 Jan]Sumsets 求和【dp】
- bzoj 1677: [Usaco2005 Jan]Sumsets 求和(DP)
- bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声
- BZOJ 1735: [Usaco2005 jan]Muddy Fields 泥泞的牧场
- bzoj:1677 [Usaco2005 Jan]Sumsets 求和
- BZOJ1736 [Usaco2005 jan]The Wedding Juicer 婚宴的榨汁机
- [USACO2005][POJ2228]Naptime(对特殊环状DP的处理)
- BZOJ1679: [Usaco2005 Jan]Moo Volume 牛的呼声
- BZOJ1677: [Usaco2005 Jan]Sumsets 求和
- BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )
- 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp
- BZOJ 1679: [Usaco2005 Jan]Moo Volume 牛的呼声( )
- 【BZOJ】1642: [Usaco2007 Nov]Milking Time 挤奶时间(dp)
- bzoj1677[Usaco2005 Jan]Sumsets 求和
- 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)