1.90分
洛谷P4328
#include<bits/stdc++.h>
using namespace std;
int vis[51][51],v[51][51],z[51][51],ex,ey,n,m;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
char a[51][51];
struct node
{
int x,y,ans;
};
queue<node>q;
void bfs1()
{
while(!q.empty())
{
node now=q.front();
q.pop();
for(int i=0;i<4;++i)
{
int nx=now.x+dx[i];
int ny=now.y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&v[nx][ny]==99999&&a[nx][ny]!='X'&&a[nx][ny]!='D')
{
v[nx][ny]=min(v[nx][ny],now.ans+1);
q.push({nx,ny,now.ans+1});
}
}
}
}
void bfs2(int x,int y)
{
q.push({x,y,0});
while(!q.empty())
{
node now=q.front();
q.pop();
if(z[now.x][now.y])
{
cout<<now.ans;
return;
}
for(int i=0;i<4;++i)
{
int nx=now.x+dx[i];
int ny=now.y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!vis[nx][ny]&&(a[nx][ny]=='.'||a[nx][ny]=='D')&&v[nx][ny]>now.ans)
{
vis[nx][ny]=1;
q.push({nx,ny,now.ans+1});
}
}
}
cout<<"KAKTUS";
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j) v[i][j]=99999;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
cin>>a[i][j];
if(a[i][j]=='*')
{
v[i][j]=0;
q.push({i,j,0});
}
if(a[i][j]=='S')
{
ex=i;
ey=j;
}
if(a[i][j]=='D') z[i][j]=1;
}
bfs1();
vis[ex][ey]=1;
bfs2(ex,ey);
return 0;
}
2.80分
洛谷P10108
#include<bits/stdc++.h>
using namespace std;
int dp[20005],a[101],w[20005],m,n,v,t;
int main()
{
cin>>m>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=0;i<m;++i) cin>>w[i];
for(int i=1;i<=m*2;++i)
{
v=INT_MIN;
for(int j=1;j<=n;++j)
if(i>=a[j]&&i-a[j]<m) v=max(v,dp[i-a[j]]+w[i-a[j]]);
dp[i]=v;
}
for(int i=m;i<=m*2;++i) t=max(t,dp[i]+w[i]);
cout<<t;
return 0;
}
