I know it is DP.but I wrong ans at test 6;
My dp transfer equation is
i is the length of name s, j is current position ,r is represent that r characters have been replace. h is the the latter characters .
This is the code.
- int rec[30][30]={0};
- int dp[101][30][101];
- bool flag[101][30][101];
- int main()
- {
- int i,j,r,h,c;
- char str[1001],k,n,ac[5],ab[5];
- scanf("%s %d",&str,&k);
- scanf("%d",&n);
- //gets(&ac);
- for(i=0;i<n;i++)
- {
- scanf("%s %s %d",ab,ac,&c);
- rec[ab[0]-'a'][ac[0]-'a']=c;
- }
- int len=strlen(str);
- memset(flag,0,sizeof(flag));
- for(i=0;i<26;i++)
- {
- if(i==str[len-1]-'a')
- {
- dp[len-1][i][0]=0;
- flag[len-1][i][0]=1;
- }
- else
- {
- dp[len-1][i][1]=0;
- flag[len-1][i][1]=1;
- }
- }
- if(len==1)
- {
- printf("0\n");
- return 0;
- }
- int ans=0;
- bool si=0;
- for(i=len-2;i>=0;i--)
- {
- for(j=0;j<26;j++)
- {
- if(j==str[i]-'a')
- {
- for(h=0;h<=k;h++)
- {
- for(r=0;r<26;r++)
- {
- if(flag[i+1][r][h]==0)continue;
- if(flag[i][j][h]==0)
- {
- dp[i][j][h]=dp[i+1][r][h]+rec[j][r];
- flag[i][j][h]=1;
- }
- else dp[i][j][h]=max(dp[i][j][h],dp[i+1][r][h]+rec[j][r]);
- }
- }
- }
- else
- {
- for(h=1;h<=k;h++)
- {
- for(r=0;r<26;r++)
- {
- if(flag[i+1][r][h-1]==0)continue;
- if(flag[i][j][h]==0)
- {
- dp[i][j][h]=dp[i+1][r][h-1]+rec[j][r];
- flag[i][j][h]=1;
- }
- else
- dp[i][j][h]=max(dp[i][j][h],dp[i+1][r][h-1]+rec[j][r]);
- }
- }
- }
- }
- }
- ans=0;
- si=0;
- for(i=0;i<26;i++)
- {
- for(j=0;j<=k;j++)
- {
- if(flag[0][i][j]==1)
- {
- if(si==0)
- {
- si=1;
- ans=dp[0][i][j];
- }
- else ans=max(ans,dp[0][i][j]);
- }
- }
- }
- printf("%d\n",ans);
- return 0;
- }







+1
