이름
시험 점수 : 60
기본 알고리즘은, 동적 프로그래밍, 고정밀 동적 규칙, 동적 범위 조정
캐주얼 작업 :
동적 범위 조정 보드
시험 전략 :
디지털 형태로 모든 문자가 저장된다 [I] [J] [I] [j]가 이전 발현 J는 F 조가 [I] [J]를, i에서 j까지의 디지털 형태로 표현되어있는 번호, 제품의 부품으로 분할되어 I + 1 [i]는 초기 상태를 분할 [0] 제 F A [1] [i]를
열거 제 1 부분을 분할하고 그 분할의 위치 (F) 상태 천이 식을 결정할 수있다 단부 판 정부 [I] [J] = 최대 (F [I] [J], F [I-1] L * A [L + 1] [J]);
코드
#include<stdio.h> #include<stdlib.h> #include<iostream> #define LL long long #define FORa(i,s,e) for(int i=s;i<=e;i++) #define FORs(i,s,e) for(int i=s;i>=e;i--) #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),pa==pb)?EOF:*pa++ #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout); using namespace std; static char buf[100000],*pa=buf,*pb=buf; inline int read(); const int K=6,N=40; string s; LL k,n,f[K+1][N+1],a[N+1][N+1];//a[i][j]将i-j字符转换为数字形式,f[i][j]代表在前j个数中划分i+1部分的最大乘积 int main() { scanf("%d%d",&n,&k); cin>>s; FORa(i,1,n) FORa(j,i,n) a[i][j]=a[i][j-1]*10+s[j-1]-'0';//处理成数字形式 FORa(i,1,n) f[0][i]=a[1][i]; FORa(i,1,k) FORa(j,1,n) FORa(l,i-1,j-1)//注意最小值为k-1,而不是i,自己思考一下为什么这样 f[i][j]=max(f[i][j],f[i-1][l]*a[l+1][j]); printf("%lld",f[k][n]); return 0; } inline int read() { register int x(0);register int f(1);register c(gc); while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc; while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc; return x*f; }
总结:
注意边界,判断数据的大小(此处需打高精)