orz!ymz!!
感谢ymz大佬对我这个智障+蒟蒻的耐心讲解啊~
切入主题。。。
FriendlyRobot
是道DP没错啦!
设
表示当前执行完了
操作 回到了原点 修改了
次 回到原点的最多方案数(状态设计满分!
然后就可以先预处理出前缀
(可以计算出修改几次嘛。。
注意是要加一句判断的23333
#include <bits/stdc++.h>
using namespace std;
const int N=310;
int dp[N][N],dx[N],dy[N];
class FriendlyRobot {
public:
int findMaximumReturns(string instructions, int changesAllowed);
};
int yyqx(int x,int y){
int q=abs(dx[y]-dx[x]),e=abs(dy[y]-dy[x]);
return (q+e)/2;
}
int FriendlyRobot::findMaximumReturns(string instructions, int changesAllowed) {
int n=instructions.size(),m=changesAllowed;
int maxn=0;
for(int i=1;i<=n;++i){
dx[i]=dx[i-1],dy[i]=dy[i-1];
if(instructions[i-1]=='U') dx[i]++;
if(instructions[i-1]=='D') dx[i]--;
if(instructions[i-1]=='L') dy[i]++;
if(instructions[i-1]=='R') dy[i]--;
}
memset(dp,-1,sizeof(dp));
for(int i=0;i<=n;i+=2) if(!dx[i]&&!dy[i]) dp[i][0]=0;
for(int i=0;i<=n;i+=2){
for(int j=0;j<=min(i/2,m);++j){
if(dp[i][j]!=-1){
maxn=max(maxn,dp[i][j]);
for(int k=i+2;k<=n;k+=2){
int w=yyqx(i,k);
if(w+j<=m) dp[k][j+w]=max(dp[k][j+w],dp[i][j]+1);
maxn=max(maxn,dp[k][j+w]);
}
}
}
}
return maxn;
}