uva11552
来源:互联网 发布:mac不能保存书签 编辑:程序博客网 时间:2024/05/17 06:51
做过难的dp再做这种,就能很清晰的发现状态转移过程中关键的状态量
就是第i组结束后末尾的字母
dp[i][j]表示前i组,以j结尾的最少块数
dp[i][j] 转移时要转移到全部的dp[i-1][k] 分成k等于j和k不等于j分别考虑
难得1A,水题。。
#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>const int INF = 111111111;using namespace std; int main() { int t; scanf("%d",&t); while(t--){ char s[1005]; int have[1005][27]; int num[1005];int dp[1005][27];int k,l,part; memset(have,0,sizeof(have)); memset(num,0,sizeof(num)); memset(dp,0,sizeof(dp));scanf("%d",&k);scanf("%s",s); l = strlen(s); part = l / k; for(int i = 1; i <= part; i++){ int start = (i - 1)*k;for(int j = 0; j < k; j++){ if (have[i][s[start + j] - 'a'] != 1) num[i]++;have[i][s[start + j] - 'a'] = 1; } //printf("%d\n",num[i]); } for(int j = 0; j <= 25; j++) dp[1][j] = have[1][j]?num[1] : INF; for(int i = 2; i <= part; i++)for(int j = 0; j <= 25; j++){if (!have[i][j]){dp[i][j] = INF;continue;}dp[i][j] = INF;for(int q = 0; q <= 25; q++){if (q == j){if (num[i] == 1) dp[i][j] = min(dp[i][j],dp[i - 1][q]);else dp[i][j] = min(dp[i][j],dp[i - 1][q] + num[i]);}else{if (have[i][q]) dp[i][j] = min(dp[i][j],dp[i - 1][q] + num[i] - 1);else dp[i][j] = min(dp[i][j],dp[i - 1][q] + num[i]);}}}int ans = INF;for(int j = 0; j <= 25; j++) ans = min(ans,dp[part][j]);printf("%d\n",ans); } return 0; }
0 0
- uva11552
- uva11552
- uva11552
- UVa11552
- uva11552 字符串重排
- uva11552题解(dp)
- UVa11552 Fewest Flops
- LA4256 UVa11552 dp状态设计
- UVA11552[Fewest Flops] 动态规划
- UVA11552------FEWEST FLOPS------区间型的DP
- UVA11552——Fewest Flops(DP)
- 分类-1-逻辑回归(Logistic regression)、感知学习算法(perceptron learning algorithm)、牛顿迭代法
- nyoj开心的小明
- POJ 1251Jungle Roads
- 建立神经网络:Part 0
- 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
- uva11552
- C是如何支持OC运行的
- linux命令echo和cat比较
- springmvc中@ReuqestBody和@ResponseBody传输json数据
- Problem M: 递归函数--进制转换(十进制转二进制)
- IOS学习之——快速创建当前视图的Navigation,TabBar Controller
- 分布式版本控制系统--git的基本知识
- Problem N: C/C++经典程序训练2---斐波那契(Fibonacci)数列
- Android studio 布局文件变全黑