您的位置:首页 > 其它

HDU 4323 Magic Number(DP)

2016-03-19 19:21 375 查看
题意:给出n个长度不超过10的字符串,m次询问,每次询问给出一个字符串和一个操作次数上限,询问有多少个字符串可以经过不超过上限次操作变成给定的字符串。思路:动态规划,类似lcs,dp[i][j]表示前一个字符串的前I个字符和后一个字符串的前j个字符所需要的操作次数,转移方程为dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1);if (a[i] == b[j])    dp[i][j] = min(dp[i][j], dp[i-1][j-1]);else    dp[i][j] = min(dp[i][j], dp[i-1][j-1]+1);
</pre><pre class="cpp" name="code" snippet_file_name="blog_20160319_7_9617236" code_snippet_id="1616394">
#include<bits/stdc++.h>#define eps 1e-6#define LL long long#define pii pair<int, int>#define pb push_back#define mp make_pair//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int MAXN = 1600;//const int INF = 0x3f3f3f3f;int n, m;char num[MAXN][15];char q[15];int th;int dp[12][12];int DP(char *a, char *b){int len_a = strlen(a+1), len_b = strlen(b+1);memset(dp, 0, sizeof(dp));for (int i = 1; i <= len_b; i++)dp[0][i] = i;for (int i = 1; i <= len_a; i++)dp[i][0] = i;for (int i = 1; i <= len_a; i++) {for (int j = 1; j <= len_b; j++) {dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1);if (a[i] == b[j])dp[i][j] = min(dp[i][j], dp[i-1][j-1]);elsedp[i][j] = min(dp[i][j], dp[i-1][j-1]+1);}}return dp[len_a][len_b];}int solve(){int ret = 0;for (int i = 1; i <= n; i++) {if (DP(q, num[i]) <= th)ret++;}return ret;}int main(){//freopen("input.txt", "r", stdin);int T, kase = 0;scanf("%d", &T);while (T--) {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++)scanf("%s", num[i]+1);printf("Case #%d:\n", ++kase);for (int i = 1; i <= m; i++) {scanf("%s%d", q+1, &th);printf("%d\n", solve());}}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU dp