質問内容
最初に文字列の個数が与えられて,その次の行から文字列を与えられて,それらの文字列の変種距離が10未満である組み合わせが何通りあるか答える問題なのですが,1000文字くらいの文字列が100個くらいのときに実行時間が3秒を超えてしまうのですがどのようにしたら処理を早くすることが出来ますか?
50個のケースのときには実行時間が間に合っていました.
コード
C
1#include<stdio.h> 2#include<string.h> 3#include<stdlib.h> 4#include<math.h> 5#define MN3(o,p,q)((o)<(p)?((o)<(q)?(o):(q)):((p)<(q)?(p):(q))) 6#pragma GCC optimize("O3") 7char str[100][1001]; 8int main(void){ 9 int n; 10 scanf("%d",&n); 11 int count=0; 12 int i,j,x,y,k,l; 13 int length[100]; 14 int dp[1001][1001]; 15 int cost; 16 int flag1=0,flag2=0;; 17 18 19 dp[0][0]=0; 20 21 for(i=0;i<n;i++) { 22 scanf("%s",str[i]); 23 length[i]=strlen(str[i]); 24 } 25 26 for(y=0;y<=1000;y++) dp[0][y]=y; 27 for(x=0;x<=1000;x++) dp[x][0]=x; 28 29 for(i=0;i<n-1;i++){ 30 31 for(j=i+1;j<n;j++){ 32 33 flag2=0; 34 35 if(abs(length[i]-length[j])<10){ 36 flag2++; //文字の長さの差が10以上ならOK 37 for(x=1;x<=length[j];x++){ 38 39 flag1=0; 40 41 for(y=1;y<=length[i];y++){ 42 if(str[i][y-1]!=str[j][x-1]) cost=1; 43 else cost=0; 44 dp[x][y]=MN3(dp[x-1][y]+1,dp[x][y-1]+1,dp[x-1][y-1]+cost); 45 if(dp[x][y]>9) flag1++; //下のifと合わせて使う幅の行成分が全部10以上ならOUTにする 46 } 47 48 if(flag1>=length[i]) break; 49 50 } 51 } 52 53 54 55 /* 56 for(k=0;k<=length2;k++){ 57 for(l=0;l<=length1;l++){ 58 printf("%d ",dp[k][l]); 59 } 60 printf("\n"); 61 } 62 */ 63 64 if(flag1<length[i] && flag2!=0) { 65 count++; 66 //printf("%d:",dp[length2][length1]); 67 } 68 } 69 } 70 printf("%d\n",count); 71 return 0; 72 73}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/09 15:21
2020/07/09 22:41
2020/07/12 13:09
2020/07/12 13:10
2020/07/12 13:13
2020/07/12 13:50