62
 
 
一道非常典型的区间dp(听说数据很水dp可过,没试过,在此不作讨论,有兴趣的同学可以试一下),code上的数据实在是水,说好的int64,直接longint无脑a了。
当然正确的思路还是要讲一下的:
首先这个区间dp很裸,没有乱七八糟的注意事项,三次循环一定要注意顺序,称号数目放在最外层,其次是枚举的长度,最内部是修改决策。
初始化:将每个区间(i,j)在字符串中的值预处理,记为a数组,初始化将dp[i,0]置成a[1,i]即可
代码贴上
var
        f,a:array[0..1500,0..1500] of int64;
        x,y,i,j,k,m,n,l:longint;
        s:string;
        function max(a,b:longint):longint;
        begin if a>b then exit(a) else exit(b); end;
        function num(x,y:longint):int64;
        var i:int64;
        j:longint;
        begin
                i:=0;
                for j:=x to y do
                i:=i*10+(ord(s[j])-48);
                exit(i);
        end;
        begin
                readln(n,k);
                readln(s);
                l:=length(s);
                for i:=1 to l do
                for j:=1 to l do
                a[i][j]:=num(i,j);
                for i:=1 to l do f[i][0]:=a[1][i];
                for m:=1 to k do
                for i:=m+1 to l do
                for j:=m to i+1 do
                f[i][m]:=max(f[i][m],f[j][m-1]*a[j+1][i]);
                writeln(f[n][k]);
        end.
 
 
 
 喜欢就收藏一下,vic私人qq:1064864324,加我一起讨论问题,一起进步^-^