BZOJ3312: [Usaco2013 Nov]No Change

题目大意:给定一个账单序列,每张消费卡可以支付连续的一段账单,问最少用价值多少的消费卡能支付所有账单


一眼状压DP,f[i]表示i状态下最远能付到哪张账单,然后预处理一下每张消费卡从每张账单开始最远能付到哪,转移一下就行了

时间复杂度O(2^K*N)

#include
#include
#include
#include
#define N 100010
using namespace std;
int v[17],a[N];
int g[17][N];
int f[N];
int k,n,tot=0;
void pre()
{
	int i,j;
	for(i=0;iv[i])
			{
				now-=a[h];
				g[i][h]=j-1;
				h++;
			}
		}
		for(j=h;j<=n;j++)
		g[i][j]=n;
	}
}
int main()
{
	scanf("%d%d",&k,&n);
	int i,j,l,o,p,x,y;
	for(i=0;i=n)
		{
			int ans=0;
			for(i=0;i

你可能感兴趣的:(BZOJ,DP,USACO,状压DP)