[TC] SRM682 Div2 T3瞎讲报告

orz!ymz!!
感谢ymz大佬对我这个智障+蒟蒻的耐心讲解啊~

切入主题。。。

FriendlyRobot

是道DP没错啦!
d p [ i ] [ j ] dp[i][j] 表示当前执行完了 i i 操作 回到了原点 修改了 j j 次 回到原点的最多方案数(状态设计满分

然后就可以先预处理出前缀

(可以计算出修改几次嘛。。

注意是要加一句判断的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;
}

猜你喜欢

转载自blog.csdn.net/LLL_Amazing/article/details/81505174