PTA 엘리베이터 L3-020 - 3자 이상 삭제 (dp)

2144 단어 DP
제목: 소문자 영문 자모로 구성된 모든 문자열을 정해 주십시오. 그 중 세 글자를 더 삭제할 수 있도록 해 주십시오. 결과는 몇 가지 다른 문자열이 있을 수 있습니까?
사고방식: 과감하다dp[i][j]를 설정하여 이전 i자의 j자를 삭제한 결과입니다.한 문자를 삭제하는 것부터 생각해 보자. 현재 문자와 이전 문자가 같으면 중복되는 경우는 1가지밖에 없다. 바로 중복된 문자 중 하나를 삭제하는 것이다.만약 같지 않다면 이 문자를 삭제하거나 삭제하지 않는 것을 고려하면 결과는 i-1 문자의 삭제와 삭제하지 않는 상황의 합과 같다.두 문자를 삭제하는 것은 유사하다. 만약에 현재 문자가 이전 문자와 같다면 abcdeff는 중복된 부분은 (abcde) f로 구성되어 있다. 현재의 f에 대해 삭제하지 않으면 앞의 f는 반드시 삭제해야 현재의 f가 삭제된 상황과 중복될 수 있기 때문에 삭제할 기회를 앞의 f에게 주고 하나가 남으면 abcde를 준다. 그래서 중복된 방안 수는 dp[i-2]이다[1].현재 문자가 이전 문자와 같으면 abcdefe 같은 경우 현재 e에 대해 삭제하지 않으면 앞의 f와 e를 삭제하고 현재 e와 f를 삭제하는 상황이 중복되기 때문에 중복되는 경우는 하나뿐입니다.두 문자를 삭제하는 중복 상황은 왜 상기 두 가지, 예를 들어 abcedfe만 삭제해야 하는지, dfe나 df, 즉 세 문자만 중복을 구성할 수 있다.세 글자를 삭제하는 방법은 유사하지만 조금 더 고려할 뿐이다. 나는 여기에 밤을 열거하고 똑같이 밀면 된다. abcdeff, abcdefe, abcedfe.
#include
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=1e6+5;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll dp[maxn][4];
int main()
{
    std::ios::sync_with_stdio(false);
    string s;
    while(cin>>s)
    {
        memset(dp,0,sizeof(dp));
        int l=s.length();
        dp[1][1]=dp[1][0]=dp[3][3]=dp[2][2]=dp[2][0]=dp[3][0]=1;
        for(int i=2; i<=l; i++)
        {
            dp[i][0]=dp[i-1][0];
            if(s[i-1]==s[i-2])
            {
                dp[i][1]=dp[i-1][1]+dp[i-1][0]-1;
                dp[i][2]=dp[i-1][2]+dp[i-1][1]-dp[i-2][1];
                dp[i][3]=dp[i-1][3]+dp[i-1][2]-dp[i-2][2];
            }
            else if(i>=3&&s[i-1]==s[i-3])
            {
                dp[i][1]=dp[i-1][1]+dp[i-1][0];
                dp[i][2]=dp[i-1][2]+dp[i-1][1]-dp[i-2][0];
                dp[i][3]=dp[i-1][3]+dp[i-1][2]-dp[i-3][1];
            }
            else
            {
                dp[i][1]=dp[i-1][1]+dp[i-1][0];
                dp[i][2]=dp[i-1][2]+dp[i-1][1];
                dp[i][3]=dp[i-1][3]+dp[i-1][2];
                if(i>=4&&s[i-1]==s[i-4])
                    dp[i][3]--;
            }
        }
       // cout<

좋은 웹페이지 즐겨찾기