2013年8月5日

Nested DollsHDU1677

摘要: 1 /*题意:有n个矩形,用长和宽表示,如果一个的长和宽都比另一个小,那么这个嵌放在另一个中 2 所以先对w从大到小排序,w一样的按h从小到大排序,那么就从后面的箱子往前找,只要前面找到一个人h比自己大的就放入c[j]=p[i].h; 3 否则如果自己的h比前面的都大,那么必定询问到c所存的递增序列的长度+1处,那么个数加1,长度加1,把此事的h放在在c的末端 4 这个过程和最大递增子序列的找值过程类似,但是并不是求最长递增,只是利用这个过程,所以二分查找稍微有些改变,如果还是按照 5 最长公共子序列的二分查找,那么h相同的会被覆盖掉比如数据1 1 1 1 2 2 2 2,其中一个2 2会被. 阅读全文

posted @ 2013-08-05 15:59 ok_boy 阅读(158) 评论(0) 推荐(0) 编辑

2013年8月4日

CF335B

摘要: 1 /*CF335B 2 这个题目的n达到50000,但是串只是有小写字母组成,所以如果字符串的长度大于2600,那么 3 肯定存在,所开始输入就判断如果长度大于2600,那么直接找当个字母输出100个 4 否则执行LCS模块,然后判断所得最长公共是否大于100,如果小于100,那么直接输出最长公共 5 否则从两头分别取50个输出*/ 6 #include 7 #include 8 int dp[2600][2600],dir[2600][2600]; 9 char a[50005],b[2605],c[2605];10 void LCS(int n,int m)11 {12 in... 阅读全文

posted @ 2013-08-04 21:56 ok_boy 阅读(3359) 评论(0) 推荐(0) 编辑

HDU2385Stock

摘要: 1 /*既然前一天的可以省下来给过后一天卖,那么就倒着卖,那么最后一天的只能在最后一天卖,如果可以卖完,还有可卖的名额,那么就从 2 倒数第二天取,如果卖不完只能丢掉,而且必定是尽量留到价格最高的那一天卖*/ 3 /*HDU2385*/ 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int maxn=100000+10;10 struct N11 {12 int x,p,m;13 bool operator q;24 N a;25 while(t--)26 ... 阅读全文

posted @ 2013-08-04 17:53 ok_boy 阅读(299) 评论(0) 推荐(0) 编辑

滚动数组处理数据很大的公共子序列问题

摘要: 1 #include 2 #include 3 char a[5010],b[5010]; 4 short int dp[2][5010]; 5 int LCS(int n,int m) 6 { 7 memset(dp, 0, sizeof(dp)); 8 int i,j; 9 for(i=1;i=dp[i%2][j-1])18 {19 dp[i%2][j]=dp[(i-1)%2][j];20 //printf("%d %d %d\n",i%2,j,dp[i%2][j]);21 ... 阅读全文

posted @ 2013-08-04 01:12 ok_boy 阅读(141) 评论(0) 推荐(0) 编辑

2013年8月3日

HDU4635

摘要: /*最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是,同时X部中每个点到Y部的每个点都有一条边,假设X部有x个点,Y部有y个点,有x+y=n,同时边数F=x*y+x*(x-1)+y*(y-1),整理得:F=N*N-N-x*y,当x+y为定值时,二者越接近,x*y越大,所以要使得边数最多,那么X部和Y部的点数的个数差距就要越大,所以首先对于给定的有向图缩点,对于缩点后的每个点,如果100它的出度或者入度为0,那么它才有可能成为X部或者Y部,所以只要求缩点之后的出度或者入度为0的点中,包含节点数最少的那个点,令 阅读全文

posted @ 2013-08-03 01:38 ok_boy 阅读(235) 评论(0) 推荐(0) 编辑

2013年8月2日

HDU4638

摘要: 1 /*树状数组求和,一边询问一边维护,离线处理*/ 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=100000+10; 7 struct point 8 { 9 int l,r,index; 10 }node[maxn]; 11 int a[maxn]; 12 int num[maxn]; 13 int index[maxn]; 14 int result[maxn]; 15 int n,m; 16 bool cmp(const point a,const poin... 阅读全文

posted @ 2013-08-02 10:27 ok_boy 阅读(286) 评论(0) 推荐(0) 编辑

2013年8月1日

HDU4642

摘要: 1 #include 2 #include 3 int main() 4 { 5 int i,j,n,m; 6 int t; 7 scanf("%d",&t); 8 while(t--) 9 {10 scanf("%d%d",&n,&m);11 n=n*m;12 j=0;13 for(i=1;i<=n;i++)14 {15 scanf("%d",&m);16 if(m && i==n) j=1;17 ... 阅读全文

posted @ 2013-08-01 22:02 ok_boy 阅读(257) 评论(0) 推荐(0) 编辑

HDU4632

摘要: 1 /* 2 区间dp 3 dp[i][j]表示这个区间组成的子串是回文串的个数*/ 4 #include 5 #include 6 const int maxn=1010; 7 int mod=10007; 8 int dp[maxn][maxn]; 9 void init(int len)10 {11 memset(dp, 0, sizeof(dp));12 for(int i = 0; i < len; ++i)13 {14 dp[i][i] = 1;//处理一个字符的情况15 }16 }17 int main()18 {19 i... 阅读全文

posted @ 2013-08-01 21:41 ok_boy 阅读(285) 评论(0) 推荐(0) 编辑

HDU4639

摘要: 1 /*计算里面有多少个相邻的he,1个he就是1种意思,两个就是,两种,所以这是 2 一个斐波拉期数列,间隔的hehe互不影响所以是互斥事件,直接相乘就可以*/ 3 #include 4 #include 5 const int maxn=10086+10; 6 const int mod=10007; 7 int fb[maxn]; 8 void init() 9 {10 int i;11 fb[0]=fb[1]=1;12 for(i=2;i<maxn;i++)13 {14 fb[i]=(fb[i-1]+fb[i-2])%mod;15 ... 阅读全文

posted @ 2013-08-01 20:45 ok_boy 阅读(269) 评论(0) 推荐(0) 编辑

zoj2432

摘要: 1 /* 2 首先,dp的最开始是定义状态 dp[i][j] 表示A串的前i个,与B串的前j个,并以B[j]为结尾的LCIS 的长度. 3 状态转移方程: 4 if(A[i]==B[j]) dp[i][j]=max(dp[i-1][k])+1; ( 1 11 #include 12 #include 13 using namespace std;14 #define N 55015 struct node16 {17 int x,y;18 }path[N][N];19 int dp[N][N];20 int s[N],t[N];21 22 int main()23 {24 ... 阅读全文

posted @ 2013-08-01 11:05 ok_boy 阅读(406) 评论(0) 推荐(0) 编辑

导航