输入输出格式
输入格式:
一行,两个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
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
然后化简一下式子
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
关键词: