bzoj 1820: [JSOI2010]Express Service 快递服务

直接写状态的话,可以用dp[i][j][k][l]表示位置在j,k,l,当前完成的是第i个任务。

发现j,k,l一定有一个和p[i]相同,可以再减掉一维。这样的话复杂度就是m^2n的。

但是空间只有64M,所以还需要再滚动数组压掉一维。

#include
#define N 1010
#define M 210
using namespace std;
int dp[2][M][M];
int a[N]={1};
int d[M][M];
int m,n=1;
int main(){
	memset(dp,0x3f3f3f,sizeof(dp));
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&d[i][j]);
	while(scanf("%d",&a[n])!=-1) n++;
	n--;
	dp[0][2][3]=0;
	for(int i=0;i

你可能感兴趣的:(bzoj,dp,滚动数组,JSOI,bzoj,dp,滚动数组,jsoi)