题目日记:字符串折叠(区间dp)

2020-10-22

 P4302

 

 

 

 

这道是will讲的区间dp例题,我跟着思路写了一遍,发现只得了60分

 

这种dp题我还没有想到找bug的方法,所以没有头绪

直接发在论坛上看有没有大佬帮我 (狗头

 

 

 

 

#include<bits/stdc++.h>
#define ll long long 
#define Max 150
#define inf 0x7f7f7f7f
#define pos(i, a, b) for (int i = (a); i <= (b); i++)
#define neg(i, a, b) for (int i = (a); i >= (b); i--)
using namespace std;

string a;
int len;
int f[Max][Max];
int lenn[Max];


bool check(int i,int l,int L)
{
    pos(j,i,L+i-1)
    {
        if(a[j%l]!=a[j])   return false;
    }
    return true;
}

int main()
{
    //freopen("in.txt","w",stdout);
    freopen("in.txt","r",stdin);
    cin>>a;
    len=a.length();
    for(int c=0;c<len;c++) 
    {
        for(int v=c;v<len;v++)  f[c][v]=v-c+1;
    }
    for(int h=0;h<=104;h++)
    {
        if(h>=0&&h<=9) lenn[h]=1;
        else if(h>9&&h<=99) lenn[h]=2;
        else lenn[h]=3;
    }
    for(int l=2;l<len;l++)
    {
        for(int i=0;i<len-l;i++)
        {
            pos(k,i,i+l)
            {
                f[i][i+l]=min(f[i][i+l],f[i][k]+f[k+1][i+l]);
                if((l+1)%(k-i+1)!=0) continue;
                if(check(i,k-i+1,l))  f[i][i+l]=min(f[i][i+l],2+lenn[(l+1)/(k-i+1)]+f[i][k]);
            }
        }
    }
    cout<<f[0][len-1]<<endl;
    return 0;
}

 

算了

问问wy吧

网上回复太慢了(呜呜

 

 

wy发现我的错了(check)

why帮我改了

但是很遗憾yyds—why没改对

 

 

我上数据结构的时候从头推了一遍

 

 

自己改好了,check函数改成

 

a[(j-i)%l+i]

 

就AC了

 

思路一点毛病没有,还是要平静地想细节

不要把自己绕进去,越绕越容易错

又一道区间dp,针不戳

 

posted @ 2020-10-22 19:50  juuich  阅读(31)  评论(0)    收藏  举报