hdu-acm steps FatMouse's Speed
生活随笔
收集整理的這篇文章主要介紹了
hdu-acm steps FatMouse's Speed
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本想用暴力法先試試的,案例和自己找的數(shù)據(jù)都過掉了,但是始終wa,本來期待的是tle,結(jié)果始終wa。所以也就懶的管了,直接用dp來做了。主要是因?yàn)樽罱谒⒈┝Ψê蚫p這兩個(gè)專題,所以才想好好利用一下這道題。如果有哪位發(fā)現(xiàn)了我的第一個(gè)程序的錯(cuò)誤,還望告知。
暴力法(此程序不知道為何wa)
1 #include"iostream"2 #include"stdio.h"3 #include"string.h"4 #include"cmath"5 #include"algorithm"6 #define mx 10057 using namespace std;8 int cur[mx];9 int end1[mx]; 10 struct node 11 { 12 int v; 13 int w; 14 int num; 15 }mice[mx]; 16 node temp; 17 bool cmp(const node a,const node b) 18 { 19 if(a.w!=b.w) return a.w<b.w; 20 else return a.v>b.v; 21 } 22 int main() 23 { 24 int i,j,k,sum=0; 25 // while(1){ 26 while(scanf("%d%d",&mice[sum].w,&mice[sum].v)==2) {mice[sum].num=sum+1;sum++;} 27 sort(mice,mice+sum,cmp); 28 int maxsum=0; 29 for(i=0;i<sum;i++) 30 { 31 k=0; 32 for(j=i;j<sum;j++) 33 { 34 if(j==i) 35 {cur[k]=mice[j].num;temp=mice[i];} 36 else if(temp.v>mice[j].v&&temp.w!=mice[j].w) 37 { 38 cur[++k]=mice[j].num; 39 temp=mice[j]; 40 } 41 } 42 if(k+1>maxsum) {memcpy(end1,cur,sizeof(cur));maxsum=k+1;} 43 } 44 cout<<maxsum<<endl; 45 for(i=0;i<maxsum;i++) 46 cout<<end1[i]<<endl; 47 // } 48 return 0; 49 }接下來是ac掉的簡(jiǎn)單dp:這道題的思路其實(shí)很簡(jiǎn)單,是一個(gè)典型的dp問題——最長(zhǎng)上升子序列問題。狀態(tài)轉(zhuǎn)移方程為
if(dp[j]+1>dp[i])dp[i]=dp[j]+1.用一個(gè)pre數(shù)組來記錄每一個(gè)i對(duì)應(yīng)的前一個(gè)j,用于后面回溯,將路徑存入path中。maxlen用于記錄最長(zhǎng)上升子序列的長(zhǎng)度。maxindex用于記錄最長(zhǎng)上升子序列對(duì)應(yīng)的最大的i。
1 #include"iostream" 2 #include"stdio.h" 3 #include"cmath" 4 #include"algorithm" 5 #include"string.h" 6 #define mx 1005 7 using namespace std; 8 struct node 9 { 10 int w,v,index; 11 }mouse[mx]; 12 int dp[mx];//記錄每個(gè)以第i個(gè)數(shù)據(jù)結(jié)尾的符合要求的子列長(zhǎng)度 13 int pre[mx];//記錄i對(duì)應(yīng)的上一個(gè)數(shù)據(jù) 14 int path[mx];//存放最終結(jié)果的下標(biāo) 15 int maxlen;//最長(zhǎng)序列的長(zhǎng)度 16 int maxindex;//最長(zhǎng)序列的最后一個(gè)數(shù)下標(biāo) 17 bool cmp(const node a,const node b) 18 { 19 if(a.w!=b.w) return a.w<b.w; 20 else return a.v>b.v; 21 } 22 int main() 23 { 24 int i,j,k=1; 25 while(scanf("%d%d",&mouse[k].w,&mouse[k].v)==2) 26 { 27 dp[k]=1; 28 pre[k]=0; 29 mouse[k].index=k;//存放未排序前的序列號(hào),因?yàn)榻Y(jié)果需要輸出的是這個(gè)序列號(hào) 30 k++; 31 } 32 sort(mouse+1,mouse+k,cmp);//以重量從小到大為第一要求,速度從大到小為第二要求排序 33 maxlen=0; 34 for(i=1;i<k;i++) 35 { 36 for(j=1;j<i;j++) 37 { 38 if(mouse[i].w>mouse[j].w&&mouse[i].v<mouse[j].v&&dp[j]+1>dp[i]) 39 { 40 dp[i]=dp[j]+1; 41 pre[i]=j;//一第i個(gè)數(shù)據(jù)位末尾數(shù)據(jù)的前一個(gè)數(shù)據(jù)的小標(biāo)是j,用于回溯 42 if(dp[i]>maxlen)//更新maxlen和maxindex 43 { 44 maxlen=dp[i]; 45 maxindex=i; 46 } 47 } 48 } 49 } 50 i=0; 51 while(maxindex) //回溯找到原始下標(biāo)的序列 52 { 53 path[i++]=maxindex; 54 maxindex=pre[maxindex]; 55 } 56 cout<<i<<endl; 57 while(i) 58 { 59 i--; 60 cout<<mouse[path[i]].index<<endl; 61 } 62 return 0; 63 }?
轉(zhuǎn)載于:https://www.cnblogs.com/acm-jing/p/4250499.html
總結(jié)
以上是生活随笔為你收集整理的hdu-acm steps FatMouse's Speed的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 11g EM停止后无法启动
- 下一篇: 快速安装本地yum源