bzoj1499 [NOI2005]瑰丽华尔兹
这题面是什么鬼。。。
- 没卵用
- cogs上:随着“强弱弱”的节奏,托尼的晕船症也奇迹般地一点一点恢复。
bzoj上:随着“嘣嚓嚓”的节奏,托尼的晕船症也奇迹般的消失了。
洛谷上:根本没有这段题面
2333333333333 - bzoj上:当1900的音乐获得邮轮上所有人的欢迎时,他才8岁,而此时的他已经乘着海轮往返欧美大陆50余次了。
欧美大陆???长见识了 - 这题tm居然是lrj出的= =(OTZ)
扯淡结束
这题不就是dp吗?
f[i][j][k]表示i时间段后 piano到了点(j,k) 求piano这一段滑行的最长距离
(f[i][j]=sum f[i'][j']+dist)
(i',j')表示能转移过来的点
于是暴力dp出炉
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0;rg char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
const int maxx=201;
const int X[]={23333,-1,1,0,0},Y[]={23333,0,0,-1,1};
int n,m,_x,_y,k,inf;
int f[2][maxx][maxx];
int s[maxx],t[maxx],p[maxx];
char c[maxx][maxx];
il vd Max(int&a,int b){a=max(a,b);}
int main(){
n=gi(),m=gi(),_x=gi(),_y=gi(),k=gi();
rep(i,1,n)scanf("%s",c[i]+1);
rep(i,1,k)s[i]=gi(),t[i]=gi(),p[i]=gi();
memset(f[0],-127,sizeof f[0]);inf=-f[0][0][0];
f[0][_x][_y]=0;
int now=0;
rep(i,1,k){
now^=1;
memset(f[now],-127,sizeof f[now]);
rep(j,1,n)rep(l,1,m){
if(c[j][l]=='x')continue;
static int lim,x,y;
lim=t[i]-s[i]+1,x=j,y=l;
rep(o,0,lim){
if(x==0||x==n+1||y==0||y==m+1)break;
if(c[x][y]=='x')break;
Max(f[now][j][l],o+f[now^1][x][y]);
x-=X[p[i]],y-=Y[p[i]];
}
}
}
int ans=-inf;
rep(i,1,n)rep(j,1,m)Max(ans,f[now][i][j]);
printf("%d
",ans);
return 0;
}
傻B了什么优化都不加竟然A了。。。
暴力A了就A了吧……用暴力A掉此题对于写程序的人来说没有任何益处,对lrj更没坏处
不过05年的渣渣机子跑不过23333
然后
不会单调队列
加了决策优化
时间变成原来的一半啊。。。
提交记录
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0;rg char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x;
}
const int maxx=201;
const int X[]={23333,-1,1,0,0},Y[]={23333,0,0,-1,1};
int n,m,_x,_y,k,inf;
int f[2][maxx][maxx];
int s[maxx],t[maxx],p[maxx];
char c[maxx][maxx];
il vd Max(int&a,int b){a=max(a,b);}
int main(){
n=gi(),m=gi(),_x=gi(),_y=gi(),k=gi();
rep(i,1,n)scanf("%s",c[i]+1);
rep(i,1,k)s[i]=gi(),t[i]=gi(),p[i]=gi();
memset(f[0],-127,sizeof f[0]);inf=-f[0][0][0];
f[0][_x][_y]=0;
int now=0;
rep(i,1,k){
now^=1;
memset(f[now],-127,sizeof f[now]);
if(p[i]==1)rep(l,1,m){
int lst=-1;
drep(j,n,1){
if(c[j][l]=='x')continue;
static int lim,x,y;
lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
rep(o,0,lim){
if(x==0||x==n+1||y==0||y==m+1)break;
if(c[x][y]=='x')break;
if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
x-=X[p[i]],y-=Y[p[i]];
}
}
}
else if(p[i]==2)rep(l,1,m){
int lst=-1;
rep(j,1,n){
if(c[j][l]=='x')continue;
static int lim,x,y;
lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
rep(o,0,lim){
if(x==0||x==n+1||y==0||y==m+1)break;
if(c[x][y]=='x')break;
if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
x-=X[p[i]],y-=Y[p[i]];
}
}
}
else if(p[i]==3)rep(j,1,n){
int lst=-1;
drep(l,m,1){
if(c[j][l]=='x')continue;
static int lim,x,y;
lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
rep(o,0,lim){
if(x==0||x==n+1||y==0||y==m+1)break;
if(c[x][y]=='x')break;
if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
x-=X[p[i]],y-=Y[p[i]];
}
}
}
else rep(j,1,n){
int lst=-1;
rep(l,1,m){
if(c[j][l]=='x')continue;
static int lim,x,y;
lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
rep(o,0,lim){
if(x==0||x==n+1||y==0||y==m+1)break;
if(c[x][y]=='x')break;
if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
x-=X[p[i]],y-=Y[p[i]];
}
}
}
}
int ans=-inf;
rep(i,1,n)rep(j,1,m)Max(ans,f[now][i][j]);
printf("%d
",ans);
return 0;
}
更新:题面来自于电影《海上钢琴师》评分巨高