日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZOJ 2702 Unrhymable Rhymes(DP)

發布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZOJ 2702 Unrhymable Rhymes(DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1702

題目大意:給定有很多數字組成的詩,譬如?“AABB”, “ABAB”, “ABBA” and “AAAA”形式的詩句是押韻的。從中挑選,求最多可以構成多少押韻句,并且輸出這些句子在原序列中的位置。

Sample Input

15 1 2 3 1 2 1 2 3 3 2 1 1 3 2 23 1 2 3

Sample Output

3 1 2 4 5 7 8 9 10 11 12 14 150

分析:設dp[i]表示從 1 到 i 之間押韻句的最大數目,f(i,j)表示當[i,j]之間可以組出一句押韻句時為1,否則為0

    則dp[i] = max{dp[i-1] , dp[j] + f(j+1,i)}

    當(i,j)之間有2個數出現的次數大于等于2時,f(i,j)=1,這2個數可以相等,即1個數出現4次

    路徑打印課真是亂啊

代碼如下:

  

1 # include<iostream> 2 # include<cstdio> 3 # include<vector> 4 # include<algorithm> 5 using namespace std; 6 const int N = 4005; 7 int data[N],ks[N]; 8 int n,kn; 9 int dp[N]; 10 vector<int> path[N]; //記錄路徑 11 vector<int> pos[N]; 12 int par[N]; //路徑壓縮 13 int out[N/4]; //輸出路徑 14 15 void solve() 16 { 17 if(n < 4) 18 { 19 printf("0\n\n"); 20 return ; 21 } 22 kn = n; 23 sort(ks,ks+kn); //原序列復制后排序 24 kn = unique(ks,ks+kn) - ks; //去重函數,返回相鄰不重復的個數,即元素種類數 25 int i,j,k; 26 for(i=0; i<n; i++) 27 { 28 data[i] = lower_bound(ks,ks+kn,data[i]) - ks; 29 //lower_bound()返回一個 iterator 它指向在[first,last)標記的有序序列中可以插入value,而不會破壞容器順序的第一個位置,而這個位置標記了一個大于等于value 的值。 30 } 31 for(i=0; i<=3; i++) 32 { 33 dp[i] = 0; 34 par[i] = -1; 35 } 36 vector<int >tmp; 37 for(i=3; i<n; i++) 38 { 39 dp[i+1] = dp[i]; 40 path[i+1] = path[i]; 41 par[i+1] = par[i]; 42 for(j=0; j<kn; j++) 43 pos[j].clear(); 44 tmp.clear(); 45 for(j=i; j>=0; j--) 46 { 47 k = data[j]; 48 pos[k].push_back(j+1); 49 if(pos[k].size()==2) 50 { 51 tmp.push_back(pos[k][0]); 52 tmp.push_back(pos[k][1]); 53 pos[k].clear(); 54 if(tmp.size()==4) break; 55 } 56 } 57 if(j >= 0) 58 { 59 if(dp[i+1] < dp[j]+1) 60 { 61 dp[i+1] = dp[j] + 1; 62 sort(tmp.begin(),tmp.end()); 63 path[i+1] = tmp; //同為vector類型,可賦值 64 par[i+1] = j; 65 } 66 } 67 } 68 printf("%d\n",dp[n]); 69 int u; 70 u =n; 71 for(i=dp[n]-1; i>=0; i--) 72 { 73 out[i] = u; 74 u= par[u]; 75 } 76 for(i=0; i<dp[n]; i++) 77 { 78 for(j=0; j<3; j++) 79 { 80 printf("%d ",path[out[i]][j]); 81 } 82 printf("%d\n",path[out[i]][j]); 83 } 84 puts(""); 85 } 86 87 int main() 88 { 89 while(scanf("%d",&n)!=EOF) 90 { 91 for(int i =0; i<n; i++) 92 { 93 scanf("%d",&data[i]); 94 ks[i] = data[i]; 95 } 96 solve(); 97 } 98 return 0; 99 }

?

?

?

轉載于:https://www.cnblogs.com/acm-bingzi/p/3330319.html

總結

以上是生活随笔為你收集整理的ZOJ 2702 Unrhymable Rhymes(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。