博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dp乱写3:环形区间dp(数字游戏)
阅读量:4315 次
发布时间:2019-06-06

本文共 1385 字,大约阅读时间需要 4 分钟。

状态:

fmax[i,j]//表示前i个数分成j个部分的最大值

fmin[i,j]//表示前i个数分成j个部分的最小值

边界:fmax[i,1]:=(sum[i] mod 10+10) mod 10(sum[i]为前i个数的总和);fmin[i,1]:=(sum[i] mod 10+10) mod 10;

状态转移方程:

fmax[i,j]:=max(fmax[i,j],fmax[k,j-1]*ff(sum[i]-sum[k]));

fmin[i,j]:=min(fmin[i,j],fmin[k,j-1]*ff(sum[i]-sum[k]){ff为取sum[i]-sum[k]对10取余的结果});//找一个中间点,把1到k分j-1个部分,而之前我们已经做出了决策,答案保存在f[k,j-1]里,另外k+1到i看成一部分,利用前缀和求出从k+1到i的值。

处理环:把环看成一条链,旋转出这条环所有的可能性(旋转即把整个数组里的数都往前1格,第一个数则到最后一个位置)

uses math;var  a,sum:array[0..51]of longint;     fmax,fmin:array[0..51,0..10]of longint;     n,m,i,j,k,x,maxn,minn,t:longint;function ff(x:longint):longint;begin exit(((x mod 10)+10) mod 10);end;procedure dp;var i,j,k:longint;begin for i:=1 to n do sum[i]:=sum[i-1]+a[i]; for i:=0 to n do  for j:=0 to m do begin  fmax[i,j]:=-maxlongint div 10;  fmin[i,j]:=maxlongint div 10; end; for i:=1 to n do begin  fmax[i,1]:=ff(sum[i]);  fmin[i,1]:=ff(sum[i]); end; for i:=1 to n do  for j:=2 to m do   for k:=j-1 to i-1 do begin    fmax[i,j]:=max(fmax[i,j],fmax[k,j-1]*ff(sum[i]-sum[k]));    fmin[i,j]:=min(fmin[i,j],fmin[k,j-1]*ff(sum[i]-sum[k]))   end;  maxn:=max(maxn,fmax[n,m]);  minn:=min(minn,fmin[n,m]);end;begin readln(n,m); for i:=1 to n do read(a[i]); minn:=maxlongint; for i:=1 to n do begin  t:=a[1];  for j:=1 to n-1 do  a[j]:=a[j+1];  a[n]:=t;  dp; end; writeln(minn); writeln(maxn);end.

 

转载于:https://www.cnblogs.com/ljc20020730/p/7346823.html

你可能感兴趣的文章
14软件工程第七次作业
查看>>
继承的特点与注意事项
查看>>
C02面向对象
查看>>
Thunder团队第二周 - Scrum会议2
查看>>
转 sql删除重复记录
查看>>
Yum数据库错误
查看>>
HDOJ树形DP专题之考研路茫茫——空调教室
查看>>
《结对-蓝牙考勤系统-测试过程》
查看>>
PAT 1034. Head of a Gang
查看>>
微信分享
查看>>
《数据结构》第1章:绪论
查看>>
基于域名的虚拟主机(最常用)
查看>>
第八讲 shiro 整合 ssm
查看>>
Lucene
查看>>
[LeetCode] 83. Remove Duplicates from Sorted List 移除有序链表中的重复项
查看>>
CNN反卷积理解
查看>>
chrome 中firstChild老是出错
查看>>
Java 7 新的 try-with-resources 语句,自动资源释放
查看>>
封装一个函数, 查看数字在数组中是否出现过, 如果出现过就返回数字在数组中的位置,没有出现过返回-1;...
查看>>
查看用户登录情况
查看>>