work2
回答问题:
描述在这么多相似的需求面前, 你怎么维护你的设计 (父类/子类/基类, UML, 设计模式, 或者其它方法) 让整个程序的架构不至于崩溃的?
答:诚然,问题给出了很多选项如-a,-v,-h。但我觉得其架构并不复杂,-v,-h以及它们的组合其实是基于普通的最大权矩阵问题的,因而我认为这三类可分在一起作为一个original.h文件,然后带有-a的单独分类。
给出你做单元测试/代码覆盖率的最终覆盖率的报告, 用截屏显示你的代码覆盖率
答:见GITHUB附件。
你在这个作业中学到了什么? 有什么好的设计值得分享? 感想如何 (太容易 / 太难 / 太无趣)?
答:学到了如何合理架构带有命令行参数的C程序,如何计算覆盖率。
问题分析
在一维情况下我们已经分析得到了基于长度n的O(n)时间复杂度的算法。那么我们可以先考虑在二维情况下是否可以得到基于长度n宽度m的O(m)时间复杂度的算法。如我在作业1里分析。设s[x][y]为以坐标(0,0)为左上角,(x,y)为右下角的点所形成的的矩形的加和。以(a,b)(x,y)构成的矩形的值为,(s[x][y] - s[a-1][y])-(s[x][b-1] - s[a-1][b-1]),不具备一维时的单调性,只能通过在此枚举一行。时间复杂度为O(m*n*n),无法达到最好的O(m*n)。
也就是说对于普通的问题,我们只需要枚举2行的组合即先枚举i再枚举小于等于i的j,加和j-i的区间,1维处理就可以了。
而对于-v的垂直相连参数,是很容易转化为普通问题的,普通问题中只考虑j-i的区间,而这里再考虑下i-n与0-j的区间就可以了,时间复杂度也为O(m*n*n)。
而对于-h的水平相连参数,我们可以从转化出的一维问题中考虑。对于1维情况下如果收尾相连应该如何处理。一开始我考虑的是复制一遍贴在右边,但其实实现起来限制过于复杂。如果选择了超越经线0的矩形其实就是踢掉了中间的一块矩形,于是只需要找到最小的矩形,然后用正行的权减去它,与普通解想比较即可。
而对于-a参数,一开始由于我自己给它定义了宽度不超过16,我寻思可以用连通性状态压缩动态规划做,但由于之后改成了32,只能使用搜索加剪枝。经过并查集缩点之后(将正权点加合在一起作为一个点,并认为它的负权为0),其实相当于是求一个图的最大权联通子图。由于时间不够,-a参数的1我还没有完成,我的思路是这样的,先算出每个点两两之间距离,对于每个正点维护一棵以负权点到该正节点距离为重量以节点编号为编号的treap,在深度优先搜素的状态空间中,当前状态已经选好的点在每颗treap中,然后对于接下来考虑的点,先比较是否能刷新其中的任意一个treap,如果不能刷新代表本质上无法得到更优解,否则入堆,计算此时加上最小距离点之外所有权值和是否能达到已经算出的较优不行则剪枝。
original.h
#ifndef ORIGINAL_H_INCLUDED
#define ORIGINAL_H_INCLUDED
int maxsumline(int *p,int size)
{
int i;
int sum,ans;
sum=0;
ans=-1000000;
for(i=0;i<size;i++)
{
if(sum<0)
sum=0;
sum+=p[i];
if(ans<sum)
ans=sum;
}
return ans;
}
int maxsumcycle(int *p,int size)
{
int i;
int sum,ans;
sum=0;
ans=maxsumline(p,size);
for (i=0;i<size;i++)
{
sum+=p[i];
p[i] = -p[i];
}
if ((sum+maxsumline(p,size))>ans)
{
return (sum+maxsumline(p,size));
}
else return ans;
}
int maxsumblock(int a[],int n,int m,int cycle,int expand)
{
int i,j,k,tmp,totalmax=0,start;
int sum[32][32];
int t[32];
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (i!=0)
{
sum[i][j]=sum[i-1][j]+a[i*m+j];
}
else
{
sum[i][j]=a[i*m+j];
}
}
}
for (i=0;i<n;i++)
{
for (j=0;j<=i;j++)
{
for (k=0;k<m;k++)
{
t[k] = (j==0)?0:-sum[j-1][k];
t[k] +=sum[i][k];
}
tmp = cycle?maxsumcycle(t,m):maxsumline(t,m);
if (tmp>totalmax)
{
totalmax= tmp;
}
if (expand)
{
for (k=0;k<m;k++)
{
t[k]=sum[n-1][k]-sum[i][k]+sum[j][k];
// printf("%d ",t[k]);
}
//printf("\n");
tmp = cycle?maxsumcycle(t,m):maxsumline(t,m);
if (tmp>totalmax)
{
totalmax= tmp;
}
}
}
}
return totalmax;
}
#endif // ORIGINAL_H_INCLUDED
main.c:
#include "original.h"
#include <stdio.h>
int m,n,a[1024];
void init(int p)
{
int i,j;
FILE * fin;
char t[10];
t[0]=p+48;
t[1]=0;
strcat(t,"input.txt");
fin = fopen(t,"r");
fscanf(fin,"%d%d",&n,&m);
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
fscanf(fin,"%d",&a[i*m+j]);
}
}
}
int main(int argc,char * argv[])
{
int i,p,j,cycle=0,expand=0,amorphous=0;
for (i=1;i<argc;i++)
{
printf("%s\n",argv[i]);
if (argv[i][1]=='v')
{
expand=1;
}
if (argv[i][1]=='h')
{
cycle=1;
}
if (argv[i][1]='a')
{
amorphous=1;
}
}
printf("%d\n",expand);
for (p=0;p<10;p++)
{
init(p);
printf("%d\n",maxsumblock(a,n,m,cycle,expand));
}
return 0;
}
test.c:
#include <stdio.h>
#include <string.h>
int main()
{
FILE * fout;
char s[10];
int i,j,k,t=21318,m=233;
for (i=0;i<10;i++)
{
sprintf(s,"%d",i);
strcat(s,"input.txt");
printf("%s",s);
fout=fopen(s,"w");
fprintf(fout,"32 32\n");
for (j=0;j<32;j++)
{
for (k=0;k<32;k++)
{
m=(m*m)%t;
if (m%10<5)
{
fprintf(fout,"-");
}
fprintf(fout,"%d ",m);
}
fprintf(fout,"\n");
}
}
}
#ifndef TREAP_H_INCLUDED
#define TREAP_H_INCLUDED
typedef struct Node {
        int data;
        long k;
        struct Node *left,*right,*parent;
        } NODE ;
typedef struct {
        NODE *head;
        } BST;
NODE * Search(NODE *root, int x)
{
     while (root && root->data!=x)
     {
           if (root->data>x)
              root = root->left;
           else
               root = root->right;
     }
     return root;
}
void Insert(BST *t, int x ,int w)
{
     NODE *node,*child,*parent,*root;
     root = t->head;
     node = root;
     child = root;
     while (node && child)
     {
           if (node->data==x)
              child = NULL;
           else
           {
               parent = node;
               if (node->data>x)
                  node = node->left;
               else
                   node = node->right;
           }
     }
     if (child)
     {
         child = (NODE *)malloc(sizeof(NODE));
         child->left = child->right = NULL;
         child->k = w;
         child->data = x;
         child->parent = parent;
         if (parent->data>x)
            parent->left = child;
         else
             parent->right = child;
         node = child;
         while (node->parent->parent && node->k<node->parent->k)
         {
               parent = node->parent;
               if (node->data<parent->data)
               {
                   parent->left = node->right;
                   if (node->right)
                   {
                      parent->left->parent = parent;
                   }
                   node->right = parent;
                   if (parent->data<parent->parent->data)
                       parent->parent->left = node;
                   else
                       parent->parent->right = node;
               }
               else
               {
                   parent->right = node->left;
                   if (node->left)
                   {
                      parent->right->parent = parent;
                   }
                   node->left = parent;
                   if (parent->data<parent->parent->data)
                   {
                       parent->parent->left = node;
                   }
                   else
                   {
                       parent->parent->right = node;
                   }
               }
               node->parent = parent->parent;
               parent->parent = node;
         }
         if (node->parent==root && node->k<root->k)
         {
             if (node->data<root->data)
             {
                 root->left = node->right;
                 if (node->right)
                    root->left->parent = root;
                 node->right = root;
             }
             else
             {
                 root->right = node->left;
                 if (node->left)
                    root->right->parent = root;
                 node->left = root;
             }
             root->parent = node;
             node->parent = NULL;
             t->head = node;
         }
     }
     return ;
}
void Delete(BST *t,int x)
{
     NODE *node,*parent,*node1,*parent1,*root;
     int temp;
     root = t->head;
     node = root;
     while (node && node->data!=x)
     {
           parent = node;
           if (node->data>x)
              node = node->left;
           else
               node = node->right;
     }
     if (!node)
        return;
     if (node!=root)
     {
         node->k = 1000000;
         while (node->left || node->right)
         {
               if (node->left)
               {
                  node1 = node->left;
                  node->left = node1->right;
                  if (node1->right)
                     node1->right->parent = node;
               }
               else
               {
                   node1 = node->right;
                   node->right = node1->left;
                   if (node1->left)
                      node1->left->parent = node;
               }
               if (node->parent->data>node->data)
                  node->parent->left = node1;
               else
                  node->parent->right = node1;
               node1->parent = node->parent;
               node->parent = node1;
         }
         if (node->data<node->parent->data)
            node->parent->left = NULL;
         else
             node->parent->right = NULL;
         free(node);
     }
     return ;
}
void Init(BST *t, int x ,int w)
{
     t->head = (NODE *)malloc(sizeof(NODE));
     t->head->left = t->head->right = NULL;
     t->head->data = x;
     t->head->k = w;
     t->head->parent = NULL;
     return ;
}
void dfs(NODE *root)
{
     if (root)
     {
        dfs(root->left);
        printf("%d ",root->data);
        dfs(root->right);
     }
     return ;
}
#endif // TREAP_H_INCLUDED
work2的更多相关文章
- work2:贪吃蛇
		学号:2017*****7219 姓名:邰嘉琛我的码云贪吃蛇项目仓库:https://gitee.com/tjc666/sesnake/tree/master2) 给出你的各项任务完成时间估算与实际消 ... 
- 三菱PLC FB库函数调用方法 (Gx Work2版本)
		本文以 GxWorks2 软件为例 1.新建使用标签项目的工程文件 2.从其它库所在工程项目中导入库 3.选择库文件及FB功能块 4.插入FB功能块调用 
- .NET基础拾遗(5)多线程开发基础
		Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ... 
- Node.js:进程、子进程与cluster多核处理模块
		1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ... 
- SCNU ACM 2016新生赛决赛 解题报告
		新生初赛题目.解题思路.参考代码一览 A. 拒绝虐狗 Problem Description CZJ 去排队打饭的时候看到前面有几对情侣秀恩爱,作为单身狗的 CZJ 表示很难受. 现在给出一个字符串代 ... 
- SDOI 2016 游戏
		树链剖分 线段树维护区间最小值,区间最大值 更新,对于每一个区间,找到当前区间的最小值的最大值,和要更新的值比较,如果比最大值还大,则此数对于以后的询问无任何贡献,直接返回即可,若有贡献,则一直递归到 ... 
- python基础回顾1
		定义 tuple(元组), list (表) #!/usr/bin/env python # encoding: utf-8 a = 10 #定义一直变量,无需声明 s1 = (2,1.3,'love ... 
- hdu 4898 The Revenge of the Princess’ Knight
		传送阵:http://acm.hdu.edu.cn/showproblem.php?pid=4898 题目大意:一个首尾相连的字符串,将其分为k个子串,使得最大的字串最小 将所有子串排序,输出第k小即 ... 
- 前端页面使用 Json对象与Json字符串之间的互相转换
		前言 在前端页面很多时候都会用到Json这种格式的数据,最近没有前端,后端的我也要什么都要搞,对于Json对象与Json字符串之间的转换终于摸清楚了几种方式,归纳如下! 一:Json对象转换为json ... 
随机推荐
- 分析函数调用关系图(call graph)的几种方法
			绘制函数调用关系图对理解大型程序大有帮助.我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历.如果运气好一点,借助调试器的单步跟踪功能和call sta ... 
- 【leetcode】Dungeon Game (middle)
			The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ... 
- 学习记录:浏览器JAVASCRIPT里的WINDOWS,DOCUMNET
			看完以下这段话之后,就理解DOCUMNET.READY之类的说法了. 或是JAVASCRIPT的浏览器里更细致的操作DOCUMENT的东西了. DOCUMNET和WINDOWS谁大谁小, 立即执行的匿 ... 
- Android:@id和@+id
			@id代表引用已有的id,而@+id是新增加一个id 如果使用@+id/name形式,当R.java中存在名为name变量时,则该组件会使用该变量的值作为标识.如果不存在该变量,则添加一个新的变量,并 ... 
- eay ui iframe 下常问题
			背景:客户要使用https进行登录,把原来的登录做到一个小框,用iframe嵌进来进行登录. 客户拥有4个域名,但只在xxx.com域名中购买了安全证书,所以多个域名下登录所用的iframe中src是 ... 
- Layout Resource官方教程(4)<include>与<merge>
			Re-using Layouts with <include/> THIS LESSON TEACHES YOU TO Create a Re-usable Layout Use the ... 
- 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)
			转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ... 
- 高性能PHP支持静态类型
			PHP+QB是一个可选的PHP虚拟机,它声称在性能上提供了数量级的提升.而负面影响就是它需要所有的内容都必须是静态类型,同时也对数组做了一些限制. 静态 类型声明 是通过PHPDoc语法的一个扩展添加 ... 
- Spring Data JPA初使用
			我们都知道Spring是一个非常优秀的JavaEE整合框架,它尽可能的减少我们开发的工作量和难度. 在持久层的业务逻辑方面,Spring开源组织又给我们带来了同样优秀的Spring Data JPA. ... 
- webapp开发经验和资料
			开发经验: 开发资料: 1. http://xuui.net/librarys/webapps/webapp-development-of-commonly-used-code-snippets.ht ... 
