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 ...
随机推荐
- C++11 FAQ中文版--转
更新至英文版October 3, 2012 译者前言: 经过C++标准委员会的不懈努力,最新的ISO C++标准C++11,也即是原来的C++0x,已经正式发布了.让我们欢迎C++11! 今天获得St ...
- [topcoder]FlowerGarden
1.此题很勉强算DP.找了半天网上思路,是个三层的循环,n^3.2.基本思路就是先找到在第一个位置的花.这样就双层遍历,找到所有和其他不冲突的花中最高的一个,然后放到结果的首位.然后去掉此花,继续使用 ...
- GNU :6.47 Function Names as Strings
链接:http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html#Function-Names GCC provides three magic var ...
- fork、vfork、clone区别
在Linux中主要提供了fork.vfork.clone三个进程创建方法. 问题 在linux源码中这三个调用的执行过程是执行fork(),vfork(),clone()时,通过一个系统调用表映射到s ...
- 关于PHP的十大误解 你中了几个?
作为开发人员,你常常会在网上看到不使用XX的理由之类的新闻.而作为最受欢迎的开源服务器端脚本语言,PHP也难逃这样的命运.殊不知,金无足赤.人无完人,再流行的语言都会存在缺点,或者是误解,因此,有些开 ...
- easyui返回数据类型
/** * 我申请的事项List * * @param personalParamVo * @param pagePara * @return */ @ResourceMapping("my ...
- Descending Order
Descending Order Description: Your task is to make a function that can take any non-negative integer ...
- Android开发之实用小知识点汇总-2
1.EditText 中将光标移到文字末尾: EditText mEdit = (EditText)this.findViewById(R.id.EditText01); mEdit .setText ...
- 1494. Monobilliards(栈)
1494 之前记得数据结构试卷上有这种题 就是判断某一出栈顺序 是不是满足以1.2...n为入栈顺序 a1,a2,a3..an; 对于任意相邻a[i],a[i+1] 如果a[i]>a[i+1]+ ...
- poj 2049 Finding Nemo(优先队列+bfs)
题目:http://poj.org/problem?id=2049 题意: 有一个迷宫,在迷宫中有墙与门 有m道墙,每一道墙表示为(x,y,d,t)x,y表示墙的起始坐标d为0即向右t个单位,都是墙d ...