vnsc5858威尼斯城官网P2885 [USACO07NOV]电话线Telephon

时间:2019-11-09 14:29来源:计算机教程
输入输出格式 输入格式:   一行,两个01串   输出格式:   最长公共子序列的长度   输入输出样例 输入样例#1: 5 223514 输出样例#1:15 一开始自己写了个DP,居然能过样例特别兴奋,

输入输出格式

输入格式:

 

一行,两个01串

 

输出格式:

 

最长公共子序列的长度

 

输入输出样例

输入样例#1:

5 2
2
3
5
1
4

输出样例#1:15

一开始自己写了个DP,居然能过样例
特别兴奋,
但是交上去只有70分
发现时间复杂度有点高
思路比较简单:
我们可以很容易的看出这道题具有无后效性,
用dp[i][j]表示前i棵树,第i棵树高度为j的最小代价
先预处理一下dp[1][j],然后对于每一棵树,我们枚举它的前一棵树的高度和这棵树的高度,
计算一下就好
时间复杂度n*h*h

vnsc5858威尼斯城官网 1 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 #include<queue> 8 #include<cstdlib> 9 using namespace std; 10 const int MAXN=100001; 11 const int INF =0x7f7f7f7f; 12 inline void read(int &n) 13 { 14 char c=' ';bool flag=0;n=0; 15 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} 16 while(c>='0'&&c<='9')n=n*10 c-48,c=getchar(); 17 } 18 int dp[MAXN][201];// 第i棵树,高度为j的最小花费 19 int n,C; 20 int a[MAXN]; 21 int maxheight; 22 int main() 23 { 24 read(n);read(C); 25 memset(dp,INF,sizeof(dp)); 26 for(int i=1;i<=n;i ) 27 read(a[i]),maxheight=max(maxheight,a[i]); 28 for(int i=a[1];i<=maxheight;i ) 29 dp[1][i]=(i-a[1])*(i-a[1]); 30 31 for(int i=2;i<=n;i )//枚举所有树 32 for(int j=a[i];j<=maxheight;j )//枚举这棵树的高度 33 for(int k=a[i-1];k<=maxheight;k )//枚举前一棵树的高度 34 dp[i][j]=min(dp[i][j], 35 ((j-a[i])*(j-a[i]) (dp[i-1][k]) abs(j-k)*C)); 36 37 38 int ans=0x7fffff; 39 for(int i=a[n];i<=maxheight;i ) 40 ans=min(ans,dp[n][i]); 41 printf("%d",ans); 42 return 0; 43 } View Code

然后化简一下式子

 

vnsc5858威尼斯城官网 2 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 using namespace std; 6 const int MAXN=300005; 7 const int INF =0x7fffff; 8 const int maxheight=100; 9 int dp[301];// 第i棵树,高度为j的最小花费 10 int f[301]; 11 int n,C; 12 int a[MAXN]; 13 int bgsum[MAXN]; 14 int edsum[MAXN]; 15 int main() { 16 scanf("%d%d",&n,&C); 17 for(int i=0; i<n; i ) 18 scanf("%d",&a[i]); 19 memset(dp, 0x3f, sizeof(dp)); 20 for(int i=a[0]; i<=maxheight; i ) 21 dp[i]=(i-a[0])*(i-a[0]); 22 23 for(int i=1; i<n; i ) { //枚举所有树 24 memcpy(f,dp,sizeof(dp)); 25 for(int j=0; j<=maxheight; j ) dp[j]=bgsum[j]=edsum[j]=INF; 26 27 bgsum[0]=f[0]; 28 for(int j=1; j<=maxheight; j ) 29 bgsum[j]=min(bgsum[j-1],f[j]-C*j); 30 31 edsum[maxheight]=f[maxheight] maxheight*C; 32 for(int j=maxheight-1; j>=0; j--) 33 edsum[j]=min(edsum[j 1],f[j] C*j); 34 35 for(int j=a[i]; j<=maxheight; j ) //枚举这棵树的高度 36 dp[j]=min(edsum[j]-C*j,bgsum[j] C*j) (j-a[i])*(j-a[i]); 37 } 38 int ans=0x7fffff; 39 for(int i=a[n-1]; i<=maxheight; i ) 40 ans=min(ans,dp[i]); 41 printf("%d",ans); 42 return 0; 43 } View Code

 

 

http://www.bkjia.com/cjjc/1222175.htmlwww.bkjia.comtruehttp://www.bkjia.com/cjjc/1222175.htmlTechArticleP2885 [USACO07NOV]电话线Telephone Wire,p2885usaco07nov 题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to replace the old...

题目描述

输入两个01串,输出它们的最长公共子序列的长度

P2885 [USACO07NOV]电话线Telephone Wire,p2885usaco07nov

洛谷P1852 奇怪的字符串,洛谷p1852字符串

输入输出格式

输入格式:

 

  • Line 1: Two space-separated integers: N and C

  • Lines 2..N 1: Line i 1 contains a single integer: heighti

 

输出格式:

 

  • Line 1: The minimum total amount of money that it will cost Farmer John to attach the new telephone wire.

 

编辑:计算机教程 本文来源:vnsc5858威尼斯城官网P2885 [USACO07NOV]电话线Telephon

关键词: