LA4256 UVa11552 dp状态设计
2016-09-03 20:19
176 查看
这两个题的状态表示是相似的:
dp[i][j]都表示第i部分放(j)可以得到的最优解。
状态转移也是相似的:
枚举前一部分和当前部分,根据二者关系转移状态。
LA 4256
题意:
给定一个包含n个点的无向连通图和一个长度为L的序列A,你的任务是修改尽量少的数,使序列中任意两个相邻数或者相同,或者对应图中相邻的两个点。
UVa 11552
题意:
给一个字符串,把它分为k块,例如字符串“helloworld”分成2块,”hello”, “world”,每一块里面的字母可以任意的排序。最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少?
dp[i][j]都表示第i部分放(j)可以得到的最优解。
状态转移也是相似的:
枚举前一部分和当前部分,根据二者关系转移状态。
LA 4256
题意:
给定一个包含n个点的无向连通图和一个长度为L的序列A,你的任务是修改尽量少的数,使序列中任意两个相邻数或者相同,或者对应图中相邻的两个点。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int N=200+9; int g[N][N],d[N][N],s ; /* d[i][j]表示第i位上的数是j,最少需要修改的数 如果第i位上的数修改了,那么d[i][j]=d[i-1][k]+1 没有修改:d[i][j]=d[i-1][k] 当然前提是第i位和第i-1位上的数相等或者相连 */ int main() { int T,n,m,a,b,L; //freopen ("f.txt", "r", stdin); scanf ("%d", &T); while (T--) { scanf ("%d%d", &n, &m); memset (g,0,sizeof (g) ); for (int i=0; i<m; i++) { scanf ("%d%d",&a,&b); g[a][b]=g[b][a]=1; } scanf ("%d",&L); for (int i=1; i<=L; i++) scanf ("%d",&s[i]); for (int i=1; i<=n; i++) d[0][i]=0; for (int i=1; i<=L; i++) { for (int j=1; j<=n; j++) { d[i][j]=INF; for (int k=1; k<=n; k++) if (j==k||g[j][k]) if (j==s[i]) d[i][j]=min (d[i][j],d[i-1][k]); else d[i][j]=min (d[i][j],d[i-1][k]+1); } } int ans=INF; for (int i=1; i<=n; i++) ans=min (ans,d[L][i]); printf ("%d\n",ans); } return 0; } /* SampleInput 2 7 9 1 2 2 3 2 4 2 6 3 4 4 5 5 6 7 4 7 5 SampleOutput */
UVa 11552
题意:
给一个字符串,把它分为k块,例如字符串“helloworld”分成2块,”hello”, “world”,每一块里面的字母可以任意的排序。最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少?
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int INF=0x3f3f3f3f; const int N = 1e3 + 9; char s ; int f ,vis ;; /* f[L][i]表示第L组的末尾放第i个字符得到的最少块 如果第L-1组的最后一位和第L组的第一位是一样的,那么可以合并这两个,总chunks可以减少一个 即: f[i][j] = min{ 如果i-1组的最后一位和i组的第一位不同: f[i-1][k]+chunks[i], 如果i-1组的最后一位和i组的第一位相同: f[i-1][k]+chunks[i]-1 } */ int main() { //freopen("f.txt","r",stdin); int T; scanf ("%d", &T); int k; while (T--) { scanf ("%d%s",&k ,s ); int n = strlen (s); memset (f,0x3f,sizeof (f) ); for (int L=0; L<n/k; L++) { memset (vis,0,sizeof (vis) ); for (int i=L*k; i< (L+1) *k; i++) vis[s[i]]=1; int cnt=0; for (int i='a'; i<='z'; i++) cnt+=vis[i]; if (L==0) { for (int i=0; i<k; i++) f[0][i]=cnt; continue; } for (int i=0; i<k; i++) { int rear=L*k+i; for (int j=0; j<k; j++) { int pre= (L-1) *k+j; if (vis[s[pre]]&& (cnt==1||s[pre]!=s[rear]) ) f[L][i]=min (f[L][i],f[L-1][j]+cnt-1); else f[L][i]=min (f[L][i],f[L-1][j]+cnt); } } } int ans=INF; for (int i=0; i<k; i++) ans=min (ans,f[n/k-1][i]); printf ("%d\n",ans); } return 0; } /* SampleInput 2 5 helloworld 7 thefewestflops SampleOutput 8 10 */
相关文章推荐
- DP状态设计与方程总结-目录
- 【算法设计与数据结构】URAL 1152.False Mirrors(状态压缩dp+dfs)
- poj 3661 Running(dp,设计状态,)
- la4015 树形dp(状态设计)(不会)
- bzoj 4008(浅谈全局整体考虑设计状态实现期望dp)
- 【DP】hotel 题解 浅谈动态规划中的状态设计方法
- UVa 11552 - Fewest Flops(DP,状态设计)
- 计蒜之道 2017 程序设计大赛 - 计蒜客 复赛 F 腾讯消消乐 状态压缩dp、枚举+剪枝
- 教主泡嫦娥[有趣的dp状态设计]
- UVA 11552 序列划分模型 状态设计DP
- hdu 6017 Girls Love 233【dp状态设计】
- [★] .NET 偶尔连接的设计策略 -联机状态- 脱机模式- 数据同步
- 设计模式----State(状态)模式
- 深入浅出Java设计模式之状态模式
- 状态驱动的游戏智能体设计(下)
- [设计模式] 22.State 状态模式
- 设计模式与泡mm的关系之state状态模式及再思考
- 状态驱动的游戏智能体设计
- 设计模式学习笔记(二十二)——State状态
- 状态驱动的游戏智能体设计(上)