南阳37

  1 /*
  2 将字符串逆序,找出原字符串与该字符串的公共子序列,则其余部分为需要添加的字符
  3 状态转移方程参考最长公共子字符串
  4 http://www.cnblogs.com/qq188380780/p/6678471.html
  5 */
  6 #include<cstdio>
  7 #include<cstring>
  8 #define Max(a,b) ((a)>(b)?(a):(b))
  9 char a[1005],b[1005];
 10 int d[1005][1005];
 11
 12 void solven(int len)
 13 {
 14     int i,j;
 15     for(i=1; i<=len; ++i)
 16     {
 17         for(j=1; j<=len; ++j)
 18         {
 19             if(a[i-1] == b[j-1])
 20                 d[i][j] = d[i-1][j-1] + 1;
 21             else
 22                 d[i][j] = Max(d[i-1][j],d[i][j-1]);
 23         }
 24     }
 25 }
 26
 27 int main()
 28 {
 29     int t,i,j,len;
 30     scanf("%d",&t);
 31     while(t--)
 32     {
 33         memset(d,0,sizeof d);
 34         scanf("%s",a);
 35         len = strlen(a);
 36         for(i=0; i<len; ++i)
 37             b[i] = a[len-1-i];
 38         solven(len);
 39         printf("%d\n",len-d[len][len]);
 40     }
 41     return 0;
 42 }
 43
 44 //空间优化,与最长公共子序列一样
 45 #include<cstdio>
 46 #include<cstring>
 47
 48 char a[1005],b[1005];
 49 int d[1005];
 50
 51 void solven(int len)
 52 {
 53     int i,j,t,temp;
 54     for(i=0; i<len; ++i)
 55     {
 56         for(j=t=0; j<len; ++j)
 57         {
 58             temp = d[j];
 59             if(a[i] == b[j])
 60                 d[j] = t + 1;
 61             else if(d[j] < d[j-1])
 62                 d[j] = d[j-1];
 63             t = temp;
 64         }
 65     }
 66 }
 67
 68 int main()
 69 {
 70     int t,i,j,len;
 71     scanf("%d",&t);
 72     while(t--)
 73     {
 74         memset(d,0,sizeof d);
 75         scanf("%s",a);
 76         len = strlen(a);
 77         for(i=0; i<len; ++i)
 78             b[i] = a[len-1-i];
 79         solven(len);
 80         printf("%d\n",len-d[len-1]);
 81     }
 82     return 0;
 83 }
 84
 85 //另可不必再开数组存逆序,只需要记录位置即可
 86 #include<cstdio>
 87 #include<cstring>
 88
 89 char a[1005];
 90 int d[1005];
 91
 92 void solven(int len)
 93 {
 94     int i,j,t,temp;
 95     for(i=0; i<len; ++i)
 96     {
 97         for(j=t=0; j<len; ++j)
 98         {
 99             temp = d[j];
100             if(a[i] == a[len-1-j])
101                 d[j] = t + 1;
102             else if(d[j] < d[j-1])
103                 d[j] = d[j-1];
104             t = temp;
105         }
106     }
107 }
108
109 int main()
110 {
111     int t,i,j,len;
112     scanf("%d",&t);
113     while(t--)
114     {
115         memset(d,0,sizeof d);
116         scanf("%s",a);
117         len = strlen(a);
118         for(i=0; i<len; ++i)
119             b[i] = a[len-1-i];
120         solven(len);
121         printf("%d\n",len-d[len-1]);
122     }
123     return 0;
124 }
时间: 2024-10-10 14:10:21

南阳37的相关文章

南阳理工 题目9:posters(离散化+线段树)

posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally deci

南阳19--擅长排列的小明(Dfs)

时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据,每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选取m个字符进行全排

南阳 540

奇怪的排序 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情.惟独对自然数的理解与人类不一样,它是从右往左读数.比如,它看到123时,会理解成321.让它比较23与15哪一个大,它说15大.原因是它的大脑会以为是32与51在进行比较.再比如让它比较29与30,它说29大. 给定Bill两个自然数A和B,让它将 [A,B] 区间中的所有数按从小到大排序出来.你会认为它如何排序? 输入 第一

南阳38--布线问题

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有的楼都供上电.2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n<5)每组测试数据的第一行是两个整数v,e.v表示学校里楼的总个数(v<=500)随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100).(哪两栋楼间如果没有指明花费,则表示这

找球号(三)南阳acm528(异或&#39; ^ &#39;)

找球号(三) 时间限制:2000 ms  |  内存限制:10000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是偶数.有一天,xiaod发现少了一个球,你能帮他找出丢的那个球的球号吗? 输入 有多组测试数据.每组数据包括两行. 第一行是一个整数N(0<N<1000000),表示现在所剩的球数. 随后的一行是N个数,表示所剩的各个球的编号M(0<M<10^9). 输出 对于每组数据,输出弄丢的那个球

第37天:小米手机图片展示

1.arguments对象alert(arguments.length);//返回实参的个数只在函数内使用arguments.callee;//返回正在执行的函数,也是在函数体内使用在函数递归调用时,推荐使用arguments.callee代替函数名本身function fn(){console.log(arguments.callee);} 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <me

南阳73 比大小

比大小 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如123456789123456789要大于-123456 输入 每组测试数据占一行,输入两个不超过1000位的10进制整数a,b 数据保证输入的a,b没有前缀的0. 如果输入0 0表示输入结束.测试数据组数不超过10组 输出 如果a>b则输出"a>b",如果a<b则输出"a<b",如果相等则输出&qu

Java重写《C经典100题》 --37

[程序37] 题目:对10个数进行排序 1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换.    2.程序源代码: 1 import java.util.Arrays; 2 import java.util.Random; 3 4 /** 5 * 6 *[程序37] 7 * 题目:对10个数进行排序. 8 * 程序分析:可以利用冒泡排序,当然也可以 Arrays.sort(); 9 * 为了看清楚排序的每一个

2015南阳CCPC L - Huatuo&#39;s Medicine 水题

L - Huatuo's Medicine Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Huatuo was a famous doctor. He use identical bottles to carry the medicine. There are different types of medicine. Huatuo put medicines into the bottles and chain these b