两道都是刘汝佳《算法竞赛入门经典第二版》的课后习题

1.UVa1543.圆和多边形

题目链接:https://vjudge.net/problem/UVA-1543

题目大意:刘汝佳紫书307页习题9-14

思路:

dp(i,j,k)表示在第i~j个点中选择k个点构成多边形的最大面积,那么这个题就像一个类区间dp的方法,我们枚举中间点x,那么有

dp[i][j][k]=max(dp[i][j][k],dp[i][x][k-1]+area[i][x][j]);

其中area[i][x][j]表示枚举中间点x后,x 与端点i,j形成的三角形的面积

所以预处理所有三角形的面积,转移的时候注意点数大于等于3

#include <bits/stdc++.h>
using namespace std;
const int maxn=40+10;
const double pi=acos(-1);
int n,m;
double pos[maxn];
struct Point{double x,y;Point(double x=0,double y=0):x(x),y(y){}
};
Point p[maxn];
double dp[maxn][maxn][maxn];//第i~j个中选择k个的最大多边形面积
double area[maxn][maxn][maxn];
double get_distance(Point a,Point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double get_area(Point a,Point b,Point c){double ans=0.0;double lenab=get_distance(a,b);double lenbc=get_distance(b,c);double lenac=get_distance(a,c);double pp=(lenab+lenbc+lenac)/2;return sqrt(pp*(pp-lenab)*(pp-lenbc)*(pp-lenac));
}
void init(int n){for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){for(int k=j+1;k<=n;k++){area[i][j][k]=get_area(p[i],p[j],p[k]);}}}
}
signed main(){while(scanf("%d%d",&n,&m)!=EOF&&n&&m){for(int i=1;i<=n;i++){scanf("%lf",&pos[i]);double rec=pos[i]*2*pi;rec-=pi/2;p[i].x=1.0*sin(rec),p[i].y=1.0*cos(rec);//printf("debug %lf %lf\n",p[i].x,p[i].y);}init(n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){dp[i][j][k]=0.0;}}}for(int k=3;k<=m;k++){for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(j-i+1<3)continue;for(int x=i+1;x<j;x++){dp[i][j][k]=max(dp[i][j][k],dp[i][x][k-1]+area[i][x][j]);}}}}double ans=0;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){ans=max(ans,dp[i][j][m]);}}printf("%.6lf\n",ans);}return 0;
}

2.UVa12063.零和一

题目链接:https://vjudge.net/problem/UVA-12063

题目大意:刘汝佳紫书P345页习题10-15

思路:

因为是二进制的,只有0和1,而只有当一位为1时对答案才可能有贡献,所以我们看有多少位1就好了。

dp(i,j,t)表示前i为有j个1,它的值%k==t的方案数,那么我们枚举第i+1位的所有情况时,有

dp(i+1,j,t)+=dp(i,j,t),表示第i+1位的值为0,明显i+1!=n,否则有前导0;

dp(i+1,j+1,(t+(1<<i))%k)+=dp(i,j,t),表示第i+1位为1

枚举一下i,j,t就好了

注意n为奇数的时候

#include <bits/stdc++.h>
#define int long long
using namespace std;const int maxn=100+10;
int dp[maxn][maxn][maxn];
void init(int n,int k){for(int i=0;i<maxn;i++){for(int j=0;j<maxn;j++){for(int x=0;x<maxn;x++){dp[i][j][x]=0;}}}
}int pow_mod(int a,int p,int n){if(p == 0)  return 1;int ans = pow_mod(a,p/2,n);ans = ans * ans % n;if(p%2 == 1)    ans = ans * a % n;return ans;
}signed main(){int n,k;int T;scanf("%lld",&T);int inx=0;while(T--){scanf("%lld%lld",&n,&k);init(n,k);dp[0][0][0]=1;for(int i=0;i<n;i++){for(int j=0;j<=i;j++){for(int t=0;t<k;t++){if(i+1!=n){dp[i+1][j][t]+=dp[i][j][t];}int tmp = pow_mod(2,i,k);int mod = (tmp+t) % k;dp[i+1][j+1][mod]+=dp[i][j][t];}}}if(n&1){printf("Case %lld: 0\n",++inx);}else{printf("Case %lld: %lld\n",++inx,dp[n][n/2][0]);}}}

UVa1543.圆和多边形+UVa12063.零和一(动态规划)相关推荐

  1. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...

    链接:https://www.nowcoder.com/acm/contest/141/J 来源:牛客网 Eddy has graduated from college. Currently, he ...

  2. openlayers6 踩坑系列(三)绘制和编辑(矩形,圆,多边形,点,线)

    重要:博客内使用地图全替换为WMap,想使用的请参考我这篇博客(WMap) 最近在做矢量图形这一块,发现圆形和多边形,都可以使用openlayers自带的Modify类进行编辑,然后随意放大缩小旋转, ...

  3. leaflet动态绘制圆、多边形

    使用leaflet在页面中动态的绘制一个圆形,主要需要解决的有两点,其一是如何确定圆的中心,其二是如何确定圆的半径.解决了这两点,剩下的就是把圆作为图层添加进map中了. 使用leaflet绘制多边形 ...

  4. 硬币找零问题的动态规划实现

    一,问题描述 给定一组硬币数,找出一组最少的硬币数,来找换零钱N. 比如,可用来找零的硬币为: 1.3.4   待找的钱数为 6.用两个面值为3的硬币找零,最少硬币数为2.而不是 4,1,1 因此,总 ...

  5. 画一个圆角多边形_CAD零基础教程,矩形和多边形的画法

    矩形的绘制 首先在我们绘图工具栏中,找到矩形和多边形.选择矩形后,在绘图区点击任意一个位置,点击两点就可以绘制成一个矩形. 我们来再尝试一下任意点击两点,就可以确认这个矩形.如何来绘制一个我们所需要的 ...

  6. POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多边形相交,多边形是否为凸)...

    题意:给出一个多边形和一个圆,问是否是凸多边形,若是则再问圆是否在凸多边形内部. 分3步: 1.判断是否是凸多边形 2.判断点是否在多边形内部 3.判断点到各边的距离是否大于等于半径 上代码: #in ...

  7. 简单几何(圆与多边形公共面积) UVALive 7072 Signal Interference (14广州D)

    题目传送门 题意:一个多边形,A点和B点,满足PB <= k * PA的P的范围与多边形的公共面积. 分析:这是个阿波罗尼斯圆.既然是圆,那么设圆的一般方程:(x + D/2) ^ 2 + (y ...

  8. 使用CAD圆和多边形内、外接圆命令绘制图形。使用CAD多线段命令绘制图形

    如下图所示根据标注的尺寸,用CAD画图软件绘制出一样的图形: 目标对象 操作工具 操作系统:Windows10 CAD软件:CAD梦想画图(轻量级CAD.国产CAD软件) 步骤 1.先使用CAD圆命令 ...

  9. Leaflet学习之路五——动态绘制图形(点、线、圆、多边形)

    leaflet动态绘制图形 动态绘点 动态绘线 动态绘多边形 动态绘制矩形 2020.3.16更新 更新日志: 2019.1.14:更新了绘制多边形时tmpline没有移除的问题 2019.1.15: ...

  10. 电子围栏的实现(一):矩形、圆与多边形的处理

    矩形区域处理 针对矩形区域处理,复杂度较低.设矩形ABCD的四个顶点分别为A.B.C.D,坐标分别为A(x1,y1).B(x2,y2).C(x3,y3).D(x4,y4),设点E(x5,y5)是需要判 ...

最新文章

  1. 结合Android去水印APP谈谈分区存储
  2. tomcat主目录(ROOT.xml)和虚拟目录
  3. C语言的设计模式-接口隔离
  4. python 语言教程(3)数据类型
  5. 证书访问_3+证书|高考注册页面可访问,具体流程看这里!
  6. JavaScript 发布-订阅模式
  7. 用JADE创建多agent系统
  8. Windows Terminal v0.7 发布:支持分屏、重排选项卡和改进 UI
  9. 以TikTok为切入的海外流量打法?
  10. 格式当前时间mongodb date type
  11. 设计模式 (五) 原型模式
  12. 华为交换机学习指南基于MAC地址划分VLAN
  13. 在北理珠,如何快速被动了解(社工)一个学生
  14. android水波纹教程,Android实现简单水波纹效果
  15. 旋翼无人机及摄影测量基础
  16. 用数据说话:北京房价数据背后的数据
  17. WIN7用键盘控制鼠标
  18. Linux(Ubuntu)系统查看显卡型号
  19. 由于高精度事件计时器(HPET)驱动过时导致AMD机器装Win10的卡死蓝屏问题记录
  20. Win系统 - 解决 Win10 笔记本 WiFi 的标志变成小地球

热门文章

  1. 元气动态壁纸爬虫(入门)
  2. 拆分器控件Splitcontainer
  3. Odin Inspector 系列教程 --- 初识Odin序列化
  4. Python 可轻松开发植物大战僵尸游戏(附动态演示+源码分享)
  5. 局域网游戏联机原理解析
  6. Linux如何安装iperf软件,【iperf】iperfforLinux-最笨下载
  7. 如何解决数据流转「不可能三角」难题?
  8. 电脑围棋中的人工智能技术
  9. linux ubuntu软件中心,Ubuntu 20.04 将Ubuntu软件中心切换到Snap商店
  10. 量化—神话、黑箱与真谛