码迷,mamicode.com
首页 > 其他好文 > 详细

hdu--4632--dp

时间:2014-11-11 00:37:53      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   sp   for   

dp我突然觉得 没必要将它仔细地分成各种种类 都是利用了差不多什么递推 利用前面计算出来的子结果什么的思想

这题的状态 不难想 因为一个回文串肯定是有左右端点啊 那么就肯定有2维状态了 然后就是递推吧

这边有些初始化 可以先完成 也可以在解决的时候 一并完成 随你

我一开始自己写的是 记忆化搜索的写法. 然后有人写了直接for递推的  速度比我这 递归的快了3倍吧 

我把2种都贴上来  顺便写下 状态转移方程

dp[x][y] = dp[x][y-1] + dp[x+1][y] - dp[x+1][y-1]    if str[x]==str[y]  dp[x][y] += dp[x+1][y-1] + 1;

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int size = 1010;
 6 const int mod = 10007;
 7 int len;
 8 char str[size];
 9 int dp[size][size];
10 
11 int dfs( int L , int R )
12 {
13     if( L<1 || R>len || L>R )
14         return 0;
15     if( dp[L][R] )
16         return dp[L][R];
17     if( L==R )
18     {
19         dp[L][R] = 1;
20     }
21     else if( L+1==R )   
22     {
23         if( str[L]==str[R] )
24         {
25             dp[L][R] = 3;
26         }
27         else
28         {
29             dp[L][R] = 2;
30         }
31     }
32     else
33     {
34         if( str[L] == str[R] )
35             dp[L][R] =  ( dfs( L , R-1 )  + dfs( L+1 , R )  + 1 ) % mod ;
36         else
37             dp[L][R] = ( dfs( L , R-1 )  + dfs( L+1 , R ) - dfs( L+1 , R-1 ) + mod ) %mod;
38     }
39     return dp[L][R];
40 }
41 
42 int main()
43 {
44     int t , ans;
45     scanf("%d",&t);
46     for( int k = 1 ; k<=t ; k++ )
47     {
48         cin >> (str+1);
49         len = strlen(str+1);
50         memset( dp , 0 , sizeof(dp) );
51         ans = dfs( 1 , len );
52         printf("Case %d: %d\n",k,ans%mod);
53     }
54     return 0;
55 }
View Code

那个for循环的外层是区间长度 内存是左边端点起始坐标 这个递推顺序一定不能错  你可以根据你的状态转移方程来确定

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int size = 1010;
 6 const int mod = 10007;
 7 int len;
 8 char str[size];
 9 int dp[size][size];
10 
11 void solve( )
12 {
13     for( int i = 1 ; i<=len ; i++ )
14     {
15         for( int j = 1 ; j+i<=len ; j++ )    
16         {
17             if( str[j] == str[i+j] )
18                 dp[j][i+j] = dp[j+1][i+j] + dp[j][i+j-1] + 1;
19             else
20                 dp[j][i+j] = dp[j+1][i+j] + dp[j][i+j-1] - dp[j+1][i+j-1];
21             dp[j][i+j] = (dp[j][i+j]+mod)%mod;
22         }
23     }
24 }
25     
26 int main()
27 {
28     int t , ans;
29     scanf("%d",&t);
30     for( int k = 1 ; k<=t ; k++ )
31     {
32         cin >> (str+1);
33         len = strlen(str+1);
34         memset( dp , 0 , sizeof(dp) );
35         for( int i = 1 ; i<=len ; i++ )
36             dp[i][i] = 1;
37         solve( );
38         printf("Case %d: %d\n",k,dp[1][len]%mod);
39     }
40     return 0;
41 }
View Code

 

 

today:

  11.11   童话里都是骗人的

 

hdu--4632--dp

标签:style   blog   http   io   color   ar   os   sp   for   

原文地址:http://www.cnblogs.com/radical/p/4088483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!