题目日记:字符串折叠(区间dp)
2020-10-22

这道是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,针不戳

浙公网安备 33010602011771号