memset

动态规划23题解析

你说的曾经没有我的故事 提交于 2019-11-27 08:31:45
最近两周做了动态规划的23道经典好题,涉及到区间、树形、数位等三种动态规划类型,现在将这23道题的题解写在下面,方便大家借鉴以及我加深记忆。 upd at:20190814 20:46.T7二叉苹果树 1、石子合并 经典的区间DP问题,枚举合并的堆数作为阶段,设f[i][j]表示i->j这段区间内的最优方案,考虑在这段区间内枚举断点k,不难得到f[i][j]=min(f[i][k]+f[k+1][j]+sum(i,j))(最大值同理)。破环为链后直接进行DP即可。 #include<iostream> #include<cstring> #include<cstdio> using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} if(f)return x;return -x; } int n,a[1005],f[505][505],g[505][505],prefix[505],minn=21374404,maxn; int main() { //freopen("A.in","r"

memset()函数的赋值问题

喜欢而已 提交于 2019-11-27 08:21:39
用memset进行赋值操作 int a[3]; char b[3]; memset(a,0,sizeof(a)); 0 0 0 memset(a,1,sizeof(a)); 16843009 16843009 16843009 memset(a,-1,sizeof(a)); -1 -1 -1 memset(b,'a',sizeof(b)); a a a 参考表 sizeof(char)=1; sizeof(int)=4; sizeof(float)=4; sizeof(long)=4; sizeof(long long)=8; sizeof(double)=8; 下面对这个现象进行解释 memset是按照字节进行赋值的 它是对要进行赋值的变量的后八位二进制进行赋值 因为2^8等于256,已经完全适用于字符的ASCII了 但是呢,对于整数来说 对于1来说 1的二进制是00000000 00000000 00000000 00000001 去后面的8位00000001 而int型占4个字节,当初话的时候是进行每个字节变成00000001 就会变成0x01010101 00000001 00000001 00000001 00000001 十进制是16843009 再来看0 二进制是00000000 00000000 00000000 00000000, 取后8位00000000

why the release version memset is slower than debug version in visual studio 2012?

时光总嘲笑我的痴心妄想 提交于 2019-11-27 07:07:04
问题 why the release version memset is slower than debug version in visual studio 2012? in visual sutido 2010, it is that result too. my computer: Intel Core i7-3770 3.40GHz 8G memory os: windows 7 sp1 64bit this is my test code: #include <boost/progress.hpp> int main() { const int Size = 1000*1024*1024; char* Data = (char*)malloc(Size); #ifdef _DEBUG printf_s("debug\n"); #else printf_s("release\n"); #endif boost::progress_timer timer; memset(Data, 0, Size); return 0; } the output: release 0.27 s

动态规划23题解析

末鹿安然 提交于 2019-11-27 05:45:37
最近两周做了动态规划的23道经典好题,涉及到区间、树形、数位等三种动态规划类型,现在将这23道题的题解写在下面,方便大家借鉴以及我加深记忆。 upd at:20190815 13:41.T14周年纪念晚会 1、石子合并 经典的区间DP问题,枚举合并的堆数作为阶段,设f[i][j]表示i->j这段区间内的最优方案,考虑在这段区间内枚举断点k,不难得到f[i][j]=min(f[i][k]+f[k+1][j]+sum(i,j))(最大值同理)。破环为链后直接进行DP即可。 #include<iostream> #include<cstring> #include<cstdio> using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} if(f)return x;return -x; } int n,a[1005],f[505][505],g[505][505],prefix[505],minn=21374404,maxn; int main() { //freopen("A.in","r

C/C++混淆点-strcat和strcpy区别

烈酒焚心 提交于 2019-11-27 05:41:34
一、原因分析 假设: char * str=NULL; str=new char[11];你想为字符串str开辟一个存储十个字符的内存空间,然后你现在有两个字符串:char * c1="abc"和char * c2="123";你想将这两个字符串都拼接在str字符串中,你想用strcat这个函数。但是你 直接用strcat编译器会报错 !!!不能这样做, 应该在拼接之前使用memset(字符串指针,0,想要设置的个数)函数对新开辟的内存空间进行清空 ,也是用0来代替。如果不这样的话, 万一新开辟的内存空间有其它值的话,strcat就不是从第一个位置开始拼接 。对应本例的情况,应该在使用strcat之前调用memset(str,0,7);用7是有效字符个数为6,还有一个隐藏字符'\0'。 当然,还有一个方法,那就是先使用strcpy(str,c1),再使用strcat(str,c2)。为什么呢?因为 strcpy把c1拷贝至str的内存空间的时候是从 第一位 开始拷贝的 ,再用strcat拼接拷贝后的字符串就可以了。 二、msmset()函数介绍 memset函数详细说明:void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间s的首n个字节的值设为值c。也就是将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值

Why is std::fill(0) slower than std::fill(1)?

泄露秘密 提交于 2019-11-27 05:12:26
问题 I have observed on a system that std::fill on a large std::vector<int> was significantly and consistently slower when setting a constant value 0 compared to a constant value 1 or a dynamic value: 5.8 GiB/s vs 7.5 GiB/s However, the results are different for smaller data sizes, where fill(0) is faster: With more than one thread, at 4 GiB data size, fill(1) shows a higher slope, but reaches a much lower peak than fill(0) (51 GiB/s vs 90 GiB/s): This raises the secondary question, why the peak

ac自动机模板

╄→尐↘猪︶ㄣ 提交于 2019-11-27 05:09:10
易理解版本: // http://acm.hdu.edu.cn/showproblem.php?pid=2222 #include<bits/stdc++.h> using namespace std; const int maxn = 1e6 + 10; struct Tri { int ch[maxn][26], val[maxn], fail[maxn], sz; void init() { memset(ch[0], 0, sizeof(ch[0])); sz = 0; } void insert(char *s) { int o = 0; for (int i = 0; s[i]; i++) { int c = s[i] - ‘a’; if (!ch[o][c]) { //建立新节点 ch[o][c] = ++sz; val[sz] = 0; memset(ch[sz], 0, sizeof(ch[sz])); } o = ch[o][c]; } val[o]++; } void build() { queue q; for (int i = 0; i < 26; i++) if (ch[0][i]) { q.push(ch[0][i]); fail[ch[0][i]] = 0;//第一层节点fail都指向根 } while (!q.empty()) { int o =

练习09-三种匹配算法(模板)

做~自己de王妃 提交于 2019-11-27 04:04:27
一、 匈牙利算法 解决二分图中的最大匹配问题(很多时候都可以把题目转变成二分图, 刚学网络流有点头大 )。两个互不相交的子集V1 ,V2 寻找他们能匹配到的最大数量。(由于我菜鸡,仅仅给出几种模板,网上有很多博客讲的很好了) 1、邻接表实现(O( n^3) 模板秒切 过山车 【模板】二分图匹配 [ZJOI2009]假期的宿舍 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=1001; int n1,n2,k; //n1,n2为二分图的顶点集,其中x∈n1,y∈n2 int map[N][N],vis[N],link[N]; //link记录n2中的点y在n1中所匹配的x点的编号 int find(int x) { int i; for(i=1;i<=n2;i++) { if(map[x][i]&&!vis[i])//x->i有边,且节点i未被搜索 { vis[i]=1;//标记节点已被搜索 //如果i不属于前一个匹配M或被i匹配到的节点可以寻找到增广路 if(link[i]==0||find(link[i])) { link[i]=x;//更新 return 1;//匹配成功 } } } return 0; } int main() { int i,x

c++ std::memset学习

风格不统一 提交于 2019-11-27 03:28:55
std::memset的功能和坑 std::memset功能 初始化数组 初始化集合 初始化对象 std::memset的坑 memset一般只用于初始化不能用于字符替代转换 第三个参数 std::memset功能 memset(void* a,int b,int c) a表示初始化的对象 b表示初始化值 c表示初始化字节数 memset的方便之处在于可以将复杂的数据结构简洁得初始化 初始化数组 int main() { int buffer[10]; int n = 10; int charTemp = 1; int position = 0; int arg = 0; for (int i = 0;i < n;i++) { std::memset(buffer, arg, sizeof(int) * 10); buffer[position] = charTemp++; for (auto& e : buffer) { std::cout << e << " "; } std::cout << "\n"; } return 0; } 初始化集合 int main() { std::vector<int> buffer(10, 2); int n = 10; int charTemp = 1; int position = 0; int arg = 0; for (int i =

cudaMemset() - does it set bytes or integers?

江枫思渺然 提交于 2019-11-27 03:28:23
问题 From online documentation: cudaError_t cudaMemset (void * devPtr, int value, size_t count ) Fills the first count bytes of the memory area pointed to by devPtr with the constant byte value value. Parameters: devPtr - Pointer to device memory value - Value to set for each byte of specified memory count - Size in bytes to set This description doesn't appear to be correct as: int *dJunk; cudaMalloc((void**)&dJunk, 32*(sizeof(int)); cudaMemset(dJunk, 0x12, 32); will set all 32 integers to 0x12,