SRM556 Div1Medium LeftRightDigitsGame2

来源:互联网 发布:美工刀片的硬度 编辑:程序博客网 时间:2024/06/05 15:56

这题比较水。。
普通的一道dp题,只不过dp数组用string类型而已
定义dpl,r,f为当前以使用的区间为[l,r]
且当前的数与lowerBound[l,r]上的数值的关系为f时最小的数
x>lowerBoundf=2
x<lowerBoundf=0
否则f=1
而后很容易的就能dp
代码如下:

#include<bits/stdc++.h>using namespace std;#define M 55string dig,low;string dp[M][M][3];int getflag(string A,string B){    if(A<B)return 0;    if(A==B)return 1;    return 2;}void Min(string &A,string B){    if(B=="")return;    if(A==""||A>B)A=B;}int main(){    cin>>dig>>low;    int n=dig.size();    for(int i=0;i<n;i++){        int flag=getflag(dig.substr(0,1),low.substr(i,1));        dp[i][i][flag]=dig.substr(0,1);    }    for(int i=n-1;~i;i--)        for(int j=i+1;j<n;j++)            for(int f=0;f<3;f++){                if(dp[i+1][j][f]!=""){                    string now=dig[j-i]+dp[i+1][j][f];                    int flag=getflag(now,low.substr(i,j-i+1));                    Min(dp[i][j][flag],now);                }                if(dp[i][j-1][f]!=""){                    string now=dp[i][j-1][f]+dig[j-i];                    int flag=getflag(now,low.substr(i,j-i+1));                    Min(dp[i][j][flag],now);                }            }    Min(dp[0][n-1][1],dp[0][n-1][2]);    if(dp[0][n-1][1]!="")cout<<dp[0][n-1][1]<<endl;    else puts("-1");    return 0;}
原创粉丝点击