传送门

 

•参考资料

  [1]:HopeForBetter

•题意

  UVA 1625 "Color Length" (基础DP)

•题解(by 紫书)

  UVA 1625 "Color Length" (基础DP)

•我的理解

  用了一上午的时间,参考紫书+上述博文,终于解决了疑惑;

  定义第一个颜色序列用串 s 表示,第二个用串 t 表示,下标均从 1 开始;

  定义dp(i,j)表示串 s 的前 i 个字符与串 t 的前 j 个字符合并的最小值;

  UVA 1625 "Color Length" (基础DP)

 

  ' ? ' 是加什么呢?

  分析一下,当前的新序列包含哪些类型的字符:

  1)当前新序列包含字符 ch 的开始和结束;

  2)当前新序列只包含字符 ch 的开始,而不包含其结束;

  3)当前新序列不包含字符 ch;

  就情况①,将 si 插入到尾部后,你会发现,这个新插入的元素只会影响 1) 类型字符,怎么影响呢?

  当前字符 si 的插入会使得 1) 类型的字符首尾距离增加 1;

  那么,情况①中的 ' ? ' 指的就是 s 串的前 i-1 个字符与 t 串中的前 j 个字符的 1) 类型的字符个数;

  情况②同理;

  那么,如何求解 "s 串的前 i-1 个字符与 t 串中的前 j 个字符的 1) 类型的字符个数" 呢?

  定义 w(i,j) 表示串 s 的前 i 个字符与串 t 的前 j 个字符包含的 1) 类型的字符总个数;

 1 struct Data
 2 {
 3     int fir,las;
 4     Data(int fir=INF,int las=0):fir(fir),las(las){}
 5 };
 6 int w[maxn][maxn];
 7 
 8 void Preset()
 9 {
10     /**
11         a[i].fir:字符 'A'+i 在串s中第一次出现的位置
12         a[i].las:字符 'A'+i 在串s中最后一次出现的位置
13         b[i].fir:字符 'A'+i 在串t中第一次出现的位置
14         b[i].las:字符 'A'+i 在串t中最后一次出现的位置
15     */
16     Data a[30],b[30];
17     for(int i=1;i <= n;++i)
18     {
19         Data &tmp=a[s[i]-'A'];
20         tmp.fir=min(tmp.fir,i);
21         tmp.las=i;
22     }
23     for(int i=1;i <= m;++i)
24     {
25         Data &tmp=b[t[i]-'A'];
26         tmp.fir=min(tmp.fir,i);
27         tmp.las=i;
28     }
29     w[0][0]=0;
30     for(int i=0;i <= n;++i)
31     {
32         for(int j=0;j <= m;++j)
33         {
34             if(i)
35             {
36                 w[i][j]=w[i-1][j];
37                 int k=s[i]-'A';
38                 if(a[k].fir == i && b[k].fir > j)///判断si是否为首次出现的
39                     w[i][j]++;
40                 if(a[k].las == i && b[k].las <= j)///判断si是否为结尾字符
41                     w[i][j]--;
42             }
43             if(j)
44             {
45                 w[i][j]=w[i][j-1];
46                 int k=t[j]-'A';
47                 if(b[k].fir == j && a[k].fir > i)///判断tj是否为首次出现的
48                     w[i][j]++;
49                 if(b[k].las == j && a[k].las <= i)///判断tj是否为结尾字符
50                     w[i][j]--;
51             }
52         }
53     }
54 }
求解w(i,j)

相关文章:

  • 2022-12-23
  • 2021-12-20
  • 2021-10-07
  • 2021-09-01
  • 2022-12-23
  • 2022-12-23
  • 2022-01-15
  • 2021-07-10
猜你喜欢
  • 2019-01-25
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-10-10
  • 2021-11-09
  • 2021-09-20
相关资源
相似解决方案