猫史档案馆


爵士OIer

爵士OIer

Lv.1

无情刀永不知错 无缘份之叹奈何

获赞:2147收藏:1255浏览:61922作品收藏:509

签名:卷文化课的同时准备竞赛。

回复帖子评论
上一页55 页 / 共 147下一页

【有胆量的来运行这个程序】来啊!? 中回复

山东巡抚好像

2019-09-28T08:38:46 点赞:0

【有胆量的来运行这个程序】来啊!? 中回复

岁的法国盛顿

2019-09-28T08:38:51 点赞:0

编程猫创新编程(NOC)初赛备考攻略·第六期 中回复

难吗?很简单啊

2019-09-28T08:41:59 点赞:0

编程猫创新编程(NOC)初赛备考攻略·第六期 中回复

真的很简单

画出来的是一个正方形,边长为53*1=53,因此为53^2

2019-09-28T08:42:49 点赞:0

【搜索问题初步分析】第一题:素数环问题 中回复

我说的哪里有不好或者出错的,请指出

2019-09-28T08:43:37 点赞:0

【有胆量的来运行这个程序】来啊!? 中回复

本人亲测,很好用,立马**

2019-09-28T08:45:55 点赞:0

谁玩过ut dr? 中回复

???

2019-09-28T08:46:25 点赞:0

谁玩过ut dr? 中回复

ut是啥?dr是啥?

2019-09-28T08:46:35 点赞:0

编程猫创新编程(NOC)初赛备考攻略·第六期 中回复

这个简单

 

 

2019-09-28T18:06:30 点赞:0

【搜索问题初步分析】第一题:素数环问题 中回复

奥尔格

2019-09-28T21:39:27 点赞:0

【动态规划 · 基础】第一题:最长上升子序列 中回复

喔阿铪蛤欸

2019-09-28T21:40:32 点赞:0

【动态规划 · 基础】第一题:最长上升子序列 中回复

//1.2最长上升子序列

#include<iostream>

using namespace std;

int main(){

       int a[100005],b[100005],i,j,maxn=0,n;

       for(i=0;i<100005;i++)b[i]=1;

       cin>>n;

       for(i=0;i<n;i++)cin>>a[i];

       for(i=0;i<n;i++){

              for(j=0;j<=i;j++){

                     if(a[i]>a[j])b[i]=max(b[i],b[j]+1);

              }

       }

       for(i=0;i<n;i++){

              if(b[i]>maxn)maxn=b[i];

       }

       cout<<maxn;

       return 0;

}

给出一个数列{a1,a2,...,an},要求你选出尽量多的元素,使这些元素按其相对位置单调递增。对于给定的序列,求出最长上升子序列的长度。

这就是典型的动态规划题最长上升子序列

哦么来看一下这一题,首先,数组一个,用来存储数列。设一个数列,1 3 2 4 3 5 4 6 5 7,

分别对应a[i]的下标的值为0123456789.首先两个变量,i和j。i到0,序列为1;b[0]就为一。这时下标到了2,其中,3>1,因此b2为2……以此类推。

状态转移方程: if(a[i]>a[j])b[i]=max(b[i],b[j]+1);

那么这就是我们动态规划的一个基本的解题流程。


动态规划要满足以下条件:

最优子结构:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

子问题独立:一个子问题的状态不会影响到另一个子问题。

子问题重叠:母问题与子问题实质上是同一个问题。


最后我们以一个故事结尾:

有一个国家,所有的国民都非常老实憨厚,某天他们在自己的国家发现了十座金矿,并且这十座金矿在地图上排成一条直线,国王知道这个消息后非常高兴,他希望能够把这些金子都挖出来造福国民,首先他把这些金矿按照在地图上的位置从西至东进行编号,依次为0、1、2、3、4、5、6、7、8、9,然后他命令他的手下去对每一座金矿进行勘测,以便知道挖取每一座金矿需要多少人力以及每座金矿能够挖出多少金子,然后动员国民都来挖金子。但是国王只有10000个人。国王首先来到了第9个金矿的所在地,他的臣子告诉他,如果要挖取第9个金矿的话就需要1500个人,并且第9个金矿可以挖出8888个金子。听到这里国王哈哈大笑起来,因为原先以为要知道十个金矿在仅有10000个人的情况下最多能挖出多少金子是一件很难思考的问题,但是,就在刚才听完他的臣子所说的那句话时,国王已经知道总共最多能挖出多少金子了,国王是如何在不了解其它金矿的情况下知道最多能挖出多少金子的呢?因此他的臣子们就问他了:“最聪明的国王陛下,我们都没有告诉您其它金矿的情况,您是如何知道最终答案的呢?”得意的国王笑了笑,然后把他最得意的“左、右手”叫到跟前,说到:“我并不需要考虑最终要挖哪些金矿才能得到最多的金子,我只需要考虑我面前的这座金矿就可以了,对于我面前的这座金矿不外乎仅有两种选择,要么挖,要么不挖,对吧?”“当然,当然”大臣们回答倒。国王继续说道:“如果我挖取第9座金矿的话那么我现在就能获得8888个金子,而我将用去1500个人,那么我还剩下8500个人。我亲爱的左部下,如果你告诉我当我把所有剩下的8500个人和所有剩下的其它金矿都交给你去开采你最多能给我挖出多少金子的话,那么我不就知道了在第9个金矿一定开采的情况下所能得到的最大金币数吗?”国王的左部下听后回答道:“国王陛下,您的意思是如果我能用8500个人在其它金矿最多开采出x个金币的话,那您一共就能够获得x + 8888个金子,对吗?”“是啊……如果第9座金矿一定开采的话……”大臣们点头说到。国王笑着对着他的右部下说到:“亲爱的右部下,也许我并不打算开采这第9座金矿,那么我依然拥有10000个人,如果我把这10000个人和剩下的金矿都给你的话,你最多能给我挖出多少个金子呢?”国王的右部下聪明地说道:“尊敬的国王陛下,我明白您的意思了,如果我回答最多能购开采出y个金币的话,那您就可以在y和x+8888之间选择一个较大者,而这个较大者就是最终我们能获得的最大金币数,您看这样理解对吗?”国王笑得更灿烂了,问他的左部下:“亲爱的左部下,我给你8500个人和其余金矿的话你能告诉我最多能挖出多少金子吗?”“请您放心,这个问题难不倒我”。左部下向国王打包票说到。国王高兴地继续问他的右部下:“那右部下你呢,如果我给你10000个人和其余金矿的话你能告诉我最多能挖出多少金子吗?”“当然能了!交给我吧!”右部下同左部下一样自信地回答道。“那就拜托给你们两位了,现在我要回到我那舒适的王宫里去享受了,我期待着你们的答复。”国王说完就开始动身回去等消息了,他是多么地相信他的两个大臣能够给他一个准确的答复,因为国王其实知道他的两位大臣要比他聪明得多。故事发展到这里,你是否在想国王的这两个大臣又是如何找到让国王满意的答案的呢?国王走后,国王的左、右部下来到了第8座金矿,早已在那里等待他们的金矿勘测兵向两位大臣报道:“聪明的两位大臣,您们好,第8座金矿需要1000个人才能开采,可以获得7000个金子”。因为国王仅给他的左部下8500个人,所以国王的左部下叫来了两个人,对着其中一个人问到:“如果我给你7500个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖:“如果我给你7500个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”国王的左部下继续问另一个人:“如果我给你8500个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”国王的左部下想着:“如果他们俩都能回答我的问题的话,那国王交给我的问题不就解决了吗?哈哈哈!”因为国王给了他的右部下10000个人,所以国王的右部下同样也叫来了两个人,对着其中一个人问:“如果我给你9000个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”然后国王的右部下继续问他叫来的另一个人:“如果我给你10000个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”当然,这四个被叫来的人同样自信地回答没有问题,因为他们同样地从这两个大臣身上学到了相同的一点,而两位自认为自己一样很聪明的大臣得意地笑着回到了他们的府邸,等着别人回答他们提出来的问题,现在你知道了这两个大臣是如何解决国王交待给他们的问题了吗?那么你认为被大臣叫去的那四个人又是怎么完成大臣交给他们的问题的呢?答案是他们又找到了八个人!这个问题已经在全国传开了,更多人找到了更多人来解决这个问题,而有些人却不需要去另外找两个人帮他,很明显,当被问到给你z个人和仅有第0座金矿时最多能挖出多少金子时,就不需要别人的帮助,如果z大于等于挖取第0座金矿所需要的人数的话,那么挖出来的最多金子数就是第0座金矿能够挖出来的金子数,如果这z个人不够开采第0座金矿,那么能挖出来的最多金子数就是0,因为这唯一的金矿不够人力去开采。让我们为这些不需要别人的帮助就可以准确地得出答案的人们鼓掌吧,这就是传说中的底层劳动人民!

2019-09-28T21:40:45 点赞:0

【搜索问题初步分析】第一题:素数环问题 中回复

//1.1素数环

#include<bits/stdc++.h>

using namespace std;

int a[100]={0};

bool b[100]={0},n;

int sum=0;

bool f(int a,int b){

       int x=a+b;

       int i;

    if(c==2)return 1;

       for(i=2;i*i<=c;i++){

              if(c%i==0)return 0;

       }

       return 1;

}

int search(int k){

       int i;

       for(i=2;i<=n;i++){

              if(f(a[k-1],i)&&(!b[i])){

                     a[k]=i;b[i]=1;

                     if(k==n){

                            if(f(a[n],a[1])) sum++;

                     }

                     else{

                         search(k+1); 

                     }

                     b[i]=0;

              }

       }

}

int main(){

    int i;

    cin>>n;

    a[1]=1;

       search(2);

       cout<<sum<<endl;

       return 0;

}

以上是一个搜索经典案例:素数环

深度优先搜索是比较重要的一种算法。

1.1素数环:从1到n(1<=n<=12)这n个数摆成一个环,要求相邻的两个数的和是一个素数。请输出方案总数。如果无解,输出"no solution!"(引号不输出)

那么我们这题呢是一个最基本的搜索,可以说是很简单的了。首先这个一定要完全理解,并且应完整的自己写出来(完全不借助任何提醒)。

好,那么我们再来回过头来分析一下这道题。比如n=6。我们写一个环:

在1号放一个1。2号可以放2~6,放了2后,3号位置其中3和5满足条件。

先试探3。3号放了3以后,4好位置可以放4,但放了4之后,均不可行。故而3号放3不可行。

接下来试探3号位置放5……

如此往复循环,直至所有可能性全部搜索完成。

所以,搜索基本框架可以表示为:

int search(int k)

{

       for(i=1;i<=可能的位置;i++)

       if(满足条件)

       {

              保存结果

              if(到达目的)相应的操作

              else search(k+1);

              回溯

       }

}

现在我们在来解析一下刚刚的代码:

    b数组表示数字i有没有被用过。

    a[i]表示放在环中的数字。

    f函数的含义是判断素数。

    Search中的k表示当前搜索的数。

整个函数解释如下:

int search(int k){

       int i;

       for(i=2;i<=n;i++){

              if(f(a[k-1],i)&&(!b[i])){

                     a[k]=i;b[i]=1;//记录状态

                     if(k==n){//到达目的

                            if(f(a[n],a[1])) sum++;//如果成功,sum加一

                     }

                     else{

                         search(k+1);  //搜索下一个数

                     }

                     b[i]=0;回溯

              }

       }

}

这样一轮解释下来,对这个解法就有了一定的理解。

2019-09-28T21:41:21 点赞:0

【动态规划 · 基础】第一题:最长上升子序列 中回复

受到各方观点

2019-10-03T21:53:08 点赞:0

【求助】NOC是什么 中回复

和NOIP,NOI有什么关系?

2019-10-04T19:28:53 点赞:0

【动态规划 · 基础】第一题:最长上升子序列 中回复

的如果

2019-10-04T19:29:21 点赞:0

【搜索问题初步分析】第一题:素数环问题 中回复

就是一个递归回溯啊

2019-10-04T19:30:12 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

10000000这是个补码

2019-10-04T19:30:45 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

但是好像不太可能

2019-10-04T19:30:57 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

于是和书上的出现了歧义

2019-10-04T19:31:16 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

书上是说有这个补码的

2019-10-04T19:31:31 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

但没法减了,复原原码不起来

2019-10-04T19:32:11 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

书上说补码表示的范围最广,比如说8位的2进制,补码是-128~+127可是我算了一下,128的原码是010000000,-128原码是110000000,-128反码101111111补码110000000、那么这是怎么一个回事呢?搞不明白解释一下,然而-127的原码应该是11111111,反码10000000,补码10000001-126补码10000002,-125是补码10000003…………但是补码10000000就没有原码了啊,因为再减就没了,化简不出来了,-128的补码是个9位数

2019-10-04T19:33:02 点赞:0

不可思议的事情,我为学python感到幸运!!! 中回复

解释语言,速度慢

2019-10-04T19:34:04 点赞:0

【搜索问题初步分析】第一题:素数环问题 中回复

撒地方

2019-10-04T19:53:33 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

撒地方

2019-10-04T19:53:44 点赞:0

【求助】NOC是什么 中回复

撒地方

2019-10-04T19:54:01 点赞:0

【呃】完了 中回复

撒地方

2019-10-04T19:54:18 点赞:0

【动态规划 · 基础】第一题:最长上升子序列 中回复

撒地方

2019-10-04T19:54:32 点赞:0

【我去】原码反码补码搞的晕掉了 中回复

求助啊!

2019-10-04T19:57:38 点赞:0